如果我有:
var Shape = function()
{
this.toString_ = function() { alert(this.UL)}
}
Shape.prototype.UL = "<UL></UL>"
var _2D = function() { this.name = "_2D"}
_2D.prototype = new Shape()
var i = new _2D()
i.toString_()
当我调用i.toString_()
时,JS引擎试图找到我是否有toString_
函数而没有找到它,进入_2D.prototype
(一个Shape实例)并找到该函数。
以下是引用Shape实例的this
?
然后它执行该功能,它在警报this.UL
中发现现在没找到它,它会转到具有该属性的Shape.prototype
...
现在谁是this
?
有人能解释一下继承链中this
的价值吗?
是以i
开头...还是以Shape.prototype
结尾?
困惑!
答案 0 :(得分:2)
JavaScript中的原型继承就像这样。
每个Function对象都有一个名为“prototype”的属性。当使用“new”创建对象时,运行时会分配一个空对象并将其“prototype”属性设置为与构造函数的“prototype”属性相同的值。标准JS之后无法更新此空白对象的原型。然后可以在构造函数或更高版本中添加或删除此对象中的属性。默认值为:
MyFunction.prototype = Object.prototype
每当使用“this。[property]”访问属性时,运行时首先查看上面创建的“this”对象是否具有该属性。如果未找到,则运行时将查找“this.prototype”,然后查看“this.prototype.prototype”等,直到选中Object.prototype。如果找不到,将返回“undefined”作为属性值。
obj -> obj.prototype -> obj.prototype.prototype -> Object.prototype
例如,
var myPrototype = { prop : "ABC" }
function MyConstructor()
{
}
MyConstructor.prototype = myPrototype
var o = new MyConstructor()
alert( o.prop )
在上面,当解析“o.prop”时,运行时首先在“o”上查找名为“prop”的属性。如果没有在“o”上找到它,运行时会查看“myPrototype”。在那里找到它,返回值“ABC”。
请注意,“this”引用始终引用上面创建的对象(例如,“o”)。因此,如果您使用“this”为原型上的属性分配值,运行时实际上将创建该名称的新属性并将其放在以“this”引用的对象上而不是更新原型中的值,从而“遮蔽”原始值。为了修改原型的值,需要通过“this.prototype”直接引用原型对象。或者通过对该对象的不同引用,例如“thePrototypeObject。[property]”,假设您有一个分配给原型对象的变量。
o.prop = "DEF"
alert( o.prop )
alert( myPrototype.prop )
在这种情况下,赋值语句在“o”上创建一个名为“prop”的新属性。因此,第一个警报打印“DEF”,而第二个打印“ABC”。
var o = new MyConstructor()
myPrototype.prop = "DEF"
alert( o.prop )
alert( myPrototype.prop )
在 this 的情况下,原始原型的“prop”属性会更新,因此两者都会打印相同的值(“ABC”)。
在上面的示例中,
var Shape = function()
{
this.toString_ = function() { alert(this.UL)}
}
Shape.prototype.UL = "<UL></UL>"
var _2D = function() { this.name = "_2D"}
_2D.prototype = new Shape()
var i = new _2D()
i.toString_()
原型链如下所示:
Shape.prototype -> Object.prototype
Object.prototype.UL = "<UL></UL>"
_2D.prototype -> (new Shape) -> Object.prototype
i.prototype -> (new Shape) -> Object.prototype
因此,当解析“toString_()”时,运行时首先检查“i”,并且在那里找不到它,查看(new Shape)对象。在那里找到它,它调用“toString_()”将“i”传递为“this”。解析“this.UL”时,运行时首先查看“i”,然后是(new Shape),然后查看“Object.prototype”,最后返回它在那里找到的值。
答案 1 :(得分:1)
只需添加:
alert(this instanceof Shape);
alert(this instanceof _2D);
<{>>在toString_
方法中,您会看到您拥有的this
。