検索

ホームページ  >  に質問  >  本文

javascript - 关于prototype的一点疑惑

1

2

3

4

5

6

7

8

9

10

11

<code>    function TestClass(){

        this.property = true;

    }

 

    TestClass.prototype.getValue = function(){

        return this.property;

    };

 

    var test = new TestClass();

    window.alert(test.prototype.getValue());

</code>

问题:
在TestClass的原型对象中添加了getValue()方法,为什么无法通过原型来访问这个方法(即test.prototype.getValue()无效),而只能通过test.getValue()来调用。小弟刚接触javascript,望各位大神指点。

阿神阿神2909日前437

全員に返信(3)返信します

  • 伊谢尔伦

    伊谢尔伦2017-04-10 14:38:09

    首先, prototype是Constructor的field, instance里面根本就没有。 不妨test一下: console.log(test.prototype);
    而, Instance有一个叫[[prototype]]的内部属性, 指向Constructor.prototype。

    那么, 我们怎么通过[[prototype]]来访问Constructor.prototype呢?
    在ECMAScript 5, 有一个method可以return [[prototype]]的值; that is, Object.getPrototypeOf()

    1

    2

    <code class="lang-javascript">alert(Object.getPrototypeOf(test).getValue());

    </code>

    Learn more on JavaScript高级程序设计

    返事
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 14:38:09

    因为只有构造器TestClass才有prototype属性,testTestClass的实例,根本没有prototype属性,testproto属性指向了构造器的prototype,不过并不建议使用proto,因为proto是可以被改写的,一旦被改写,将导致javascript的原型链机制失效
    如果一个实例对象要访问原型链对象上的方法,直接使用即可,对于你代码中给出的例子,只需把最后一句改为window.alert(test.getValue())
    最后建议你先去把javascript的基础打扎实,了解一下javascript的原型和原型链,可以读一下《JavaScript高级程序设计》等书,或者看下各位大牛的博客文章,给你推荐 @nightire 大大的这篇文章

    返事
    0
  • PHPz

    PHPz2017-04-10 14:38:09

    非常感谢两位大神的指教,解除了我的一点迷惑,我正准备看JavaScript高级程序设计,深入学习。
    总结两位的答案如下:
    1.prototype属性是构造函数(TestClass())的属性,实例test没有prototype属性。
    2.实例有一个指针[[prototype]]指向构造函数的prototype。
    3.可以通过两种方法访问构造函数的prototype:通过test的proto属性和Object.getPrototypeOf(test)

    返事
    0
  • キャンセル返事