javascript原型链:Rectangle.prototype=new Shape()还是Rectangle.prototype=Shape?
我看到了两种不同的模式和解释。一个来自DailyJS和其他许多公司: Rectangle.prototype=新形状() 还有Crockford's,这意味着 矩形。原型=形状 从理论上讲,你为什么需要运行“新”系统?它运行构造函数,是的。它还将矩形的原型指定为形状的原型。但是我们应该能够通过简单地将父对象分配到原型中来实现继承 我想知道原因是否是原型链接。看起来,在案例1中,它将创建一个原型链。这意味着矩形原型将具有形状原型。 在第二种情况下,矩形的原型将只有Shape的方法,而不是Shape的原型方法 是这样吗?非常感谢你的任何想法 这意味着只有javascript原型链:Rectangle.prototype=new Shape()还是Rectangle.prototype=Shape?,javascript,inheritance,prototype,Javascript,Inheritance,Prototype,我看到了两种不同的模式和解释。一个来自DailyJS和其他许多公司: Rectangle.prototype=新形状() 还有Crockford's,这意味着 矩形。原型=形状 从理论上讲,你为什么需要运行“新”系统?它运行构造函数,是的。它还将矩形的原型指定为形状的原型。但是我们应该能够通过简单地将父对象分配到原型中来实现继承 我想知道原因是否是原型链接。看起来,在案例1中,它将创建一个原型链。这意味着矩形原型将具有形状原型。 在第二种情况下,矩形的原型将只有Shape的方法,而不是Shape
Rectangle.prototype=Shape代码>
我真的看不出来
从理论上讲,你为什么需要运行“新”系统?它运行构造函数,是的
然而,我们实际上并不需要(想要),我们只需要从Shape.prototype
它还将矩形的原型指定为形状的原型
不是真的new Shape
创建一个新对象,该对象继承自Shape.prototype
,这就是我们关心的问题。你说得对
在第二种情况下,矩形的原型将只有Shape的方法,而不是Shape的原型方法
是的,没错。您应该继承自Shape.prototype
——但是通过Object.create(Shape.prototype)
,而不是通过创建实例。看到或看到。这就是Crockford实际上所做的——甚至在EcmaScript 5.1引入Object.create
之前,他就发现了一种巧妙的方法,可以用他的helper函数实现这一点
function object(o) {
function F() {}
F.prototype = o;
return new F();
}
它现在是对象的常用垫片。在本机不支持它的浏览器中创建
这意味着只有Rectangle.prototype=Shape代码>
我真的看不出来
从理论上讲,你为什么需要运行“新”系统?它运行构造函数,是的
然而,我们实际上并不需要(想要),我们只需要从Shape.prototype
它还将矩形的原型指定为形状的原型
不是真的new Shape
创建一个新对象,该对象继承自Shape.prototype
,这就是我们关心的问题。你说得对
在第二种情况下,矩形的原型将只有Shape的方法,而不是Shape的原型方法
是的,没错。您应该继承自Shape.prototype
——但是通过Object.create(Shape.prototype)
,而不是通过创建实例。看到或看到。这就是Crockford实际上所做的——甚至在EcmaScript 5.1引入Object.create
之前,他就发现了一种巧妙的方法,可以用他的helper函数实现这一点
function object(o) {
function F() {}
F.prototype = o;
return new F();
}
它现在是对象的常用垫片。在本机不支持它的浏览器中创建。谢谢@Bergi。我可以恢复使用Object.create,但我想了解理论。非常感谢您的详细解释。实际上,我问Crockford为什么要做F.prototype=o而不是F.prototype=newo,这将(1)运行构造函数,(b)将o.prototype复制到F.prototype。根据你的解释,我现在明白了原因:他不想“实例化”o(并运行其构造函数)。顺便说一句,我们似乎失去了整个“new”关键字——代码中的对象实例化应该由这个函数(object(o))完成。此外,在调试器中,我们看不到正确的对象类型-它将始终显示为“F”否,我们仍然使用new
关键字创建Shape
s或Rectangle
s。然而,在设置继承链时,我们不需要它(并且应该避免它)。在调试器上:不确定它如何获取类型,但它可能与继承的构造函数
属性有关。您可以覆盖它(Rectangle.prototype.constructor=Rectangle
),或者在创建(Object.create(Shape.prototype,{constructor:{value:Rectangle})中设置它
在支持第二个参数to的环境中。谢谢@Bergi。我可以恢复使用Object.create,但想了解理论。非常感谢您的详细解释。我实际上问Crockford为什么要使用F.prototype=o而不是F.prototype=new o,这将(1)运行构造函数和(b)将o.prototype复制到F.prototype。根据您的解释,我现在理解了原因:他不想“实例化”o(并运行其构造函数)。顺便说一句,折衷似乎是我们失去了整个“新建”关键字——代码中的对象实例化应该由这个函数完成(对象(o))。此外,在调试器中,我们无法正确查看对象类型-它将始终显示为“F”否,我们仍然使用new
关键字来创建Shape
s或Rectangle
s。但我们不需要它(应该避免它)设置继承链时。在调试器上:不确定它如何获取类型,但可能与继承的构造函数
属性有关。您可以覆盖它(Rectangle.prototype.constructor=Rectangle
)或在创建中设置它(Object.create(Shape.prototype,{constructor:{value:Rectangle})
在支持第二个参数的环境中。