这听起来比应该更容易,但我在尝试解决此问题时遇到了问题。我的情况基本上是,我可以创建一个将要使用原型的类(例如:function exClass() {}
)。
如果我想加入课程,我可以使用:exClass.prototype.newMethod() = '';
。
那么,为什么如果我进入原型" newMethod",我就无法将新原型添加到" exClass"了。我的意思是:this.prototype.test_var1 = ''
- 它失败了,exClass.test_var1
也是如此。
为什么我无法从其子类中添加更多内容?
答案 0 :(得分:4)
对象的原型是而不是对象上名为prototype
的属性。函数上的原型字段是将成为使用该函数创建的对象原型的对象。对象可以通过constructor
函数访问创建它的函数的原型。例如,this.constructor.prototype.test_var1 = ''
在大多数情况下都适用。
我说在大多数情况下,因为许多JavaScript引擎都有内置的__proto__
,它是对象的原型,可以动态修改,但IE中不支持这种情况。
在ES5中,您可以使用Object.getPrototypeOf()来可靠地获取原型。例如,您可以说,ES5中的Object.getPrototypeOf(this).test_var1 = ''
可以在现代浏览器中使用,但不适用于没有ES5支持的浏览器。
答案 1 :(得分:3)
构造函数prototype
的{{1}}属性不引用与exClass
的实例的prototype
属性相同的对象,这是exClass
内this
引用的内容。证明:
newMethod
输出:
function exClass() {}
exClass.prototype.newMethod = function() {
console.log(this.prototype === exClass.prototype); // false
console.log(this.prototype); // undefined
}
var obj = new exClass();
obj.newMethod();
更一般地说,JavaScript中的每个对象都有一个原型对象。函数的false
undefined
属性指定原型对象对于使用该函数创建的对象类的含义。
没有什么能阻止你从另一个函数中修改函数prototype
:
prototype
或者更一般地说:
exClass.prototype.newMethod = function() {
exClass.prototype.anotherMethod = function() {}
}
但我不推荐它。
答案 2 :(得分:2)
您无法通过this.prototype
获取对象的父原型。您必须使用this.constructor.prototype
(尽管这会影响该类型的所有对象的行为,在本例中为exClass
)。这段代码将提醒“你好世界”。
function exClass() {};
exClass.prototype.newMethod = function() {
this.constructor.prototype.test_var1 = 'hello world';
}
obj = new exClass();
obj.newMethod();
alert(obj.test_var1);