JavaScript - 尝试从原型中添加原型

时间:2011-04-16 20:29:58

标签: javascript html oop prototype subclass

这听起来比应该更容易,但我在尝试解决此问题时遇到了问题。我的情况基本上是,我可以创建一个将要使用原型的类(例如:function exClass() {})。

如果我想加入课程,我可以使用:exClass.prototype.newMethod() = '';

那么,为什么如果我进入原型" newMethod",我就无法将新原型添加到" exClass"了。我的意思是:this.prototype.test_var1 = '' - 它失败了,exClass.test_var1也是如此。

为什么我无法从其子类中添加更多内容?

3 个答案:

答案 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属性相同的对象,这是exClassthis引用的内容。证明:

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);