简单的问题。
function p()
{
function A()
{
this.random = "random";
}
A.prototype.newfunc = function(){ alert("5");}
function B()
{
}
B.prototype = new A();
var bObj = new B();
}
Q1:当我设置B的prototype时,我不知道当/如果A的prototype更新时,B的prototype属性将如何更新。我的意思是,对我来说,它只是继承/复制所有这些属性。这并不是说:
B.prototype = A.prototype
其中B和A是同一个。
Q2:在A被返回并初始化到B的prototype对象之后,JS如何知道不包含该prototype属性?我的意思是,我们从来没有发生过这种情况,因为JS解释器知道只是为了砍掉A的原型的属性:
B.prototype = new A(); //any A object has an associated prototype object
B.prototype.prototype;//after initialization we no longer have the separate prototype property of A
发布于 2010-12-22 06:53:36
Q1:你自己也说过- prototype是用于继承的。因此,B继承了A的所有属性。当您添加或更改A的成员时,B也将更改。正如您所说的,它们并不相同,但A是B的超类,如果超类中的任何内容发生变化,那么子类也会发生变化。不过,您可以向B.prototype添加成员并更改其行为,而无需更改A。
试试这个:
function A()
{
}
A.prototype.alertname = function ()
{
alert (this.name);
};
function B()
{
}
B.prototype = new A();
var bObj = new B();
var aObj = new A();
A.prototype.name = "A";
aObj.alertname(); // output is "A";
bObj.alertname(); // output is "A";
B.prototype.name = "B";
aObj.alertname(); // output is "A";
bObj.alertname(); // output is "B";
Q2:同样,继承不同于组合。当你赋值B.prototype时,你不只是把一个A类型的对象放在一个占位符里,还会改变所有B类型对象的“蓝图”。所以当你访问这个蓝图时,你得到的不是一个A类型的对象,而是一个B类型的蓝图,它包含对A类型蓝图的引用。这个蓝图不会有prototype类型的成员,因为prototype不是任何一个类的“常规”成员。将此代码添加到上面的代码中:
function iterateMembers ( obj ) {
var str = "";
for (var member in obj) {
str += member + ", "
}
alert (str);
}
iterateMembers (aObj);
iterateMembers (A.prototype);
注意aObj和A.prototype都不包含成员"prototype“。现在呼叫
iterateMembers (A);
alert (typeof(A));
现在应该很明显了,prototype是类型function的成员,而且由于function既不是A也不是B继承的(事实上,它不能被继承),所以它们都不包含名为"prototype“的成员。
发布于 2010-12-22 07:52:21
Q1:当我设置B的prototype时,我不知道当/如果A的prototype更新时,B的prototype属性将如何更新。我的意思是,对我来说,它只是继承/复制所有这些属性。
Function对象有一个prototype
字段:
function A(name) { this.name = name }
print(A.prototype) // [object Object]
使用new A
创建对象时,结果对象包含一个constructor
字段,该字段是对构造函数的引用:
var a = new A('Eric')
print(a.constructor == A) // True
print(a.constructor.prototype == A.prototype) // True
如果您尝试对a
进行索引,但该字段未定义,JavaScript将尝试通过a
的原型(例如a.constructor.prototype
)来解析它。我们可以使用此方法向所有A
实例添加内容:
A.prototype.greet = function() { print('Hi, ' + this.name + '!') }
a.greet() // Hi, Eric!
此字段解析以递归方式工作。
function B(name) { this.name = name.toUpperCase() }
B.prototype = new A
b = new B("Eric")
b.greet() // Hi, ERIC!
在最后一行中发生的事情是,JavaScript在b
中没有找到'greet‘字段,所以它尝试b
的原型,也没有找到它,所以它尝试*b
的原型,依此类推,直到它用完了原型。
解释器只知道去掉A的原型的属性: B.prototype.prototype
没有任何东西被砍掉,你只是看错了东西。您需要:
B.prototype.constructor.prototype
https://stackoverflow.com/questions/4506456
复制相似问题