首页 > 关于prototype的一点疑惑

关于prototype的一点疑惑

    function TestClass(){
        this.property = true;
    }

    TestClass.prototype.getValue = function(){
        return this.property;
    };

    var test = new TestClass();
    window.alert(test.prototype.getValue());

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


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


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


首先, 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()

alert(Object.getPrototypeOf(test).getValue());

Learn more on JavaScript高级程序设计

【热门文章】
【热门文章】