原型继承中的这个值

时间:2009-07-15 14:43:46

标签: javascript inheritance

如果我有:

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结尾?

困惑!

2 个答案:

答案 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