javascript原型链:Rectangle.prototype=new Shape()还是Rectangle.prototype=Shape?

javascript原型链:Rectangle.prototype=new Shape()还是Rectangle.prototype=Shape?,javascript,inheritance,prototype,Javascript,Inheritance,Prototype,我看到了两种不同的模式和解释。一个来自DailyJS和其他许多公司: Rectangle.prototype=新形状() 还有Crockford's,这意味着 矩形。原型=形状 从理论上讲,你为什么需要运行“新”系统?它运行构造函数,是的。它还将矩形的原型指定为形状的原型。但是我们应该能够通过简单地将父对象分配到原型中来实现继承 我想知道原因是否是原型链接。看起来,在案例1中,它将创建一个原型链。这意味着矩形原型将具有形状原型。 在第二种情况下,矩形的原型将只有Shape的方法,而不是Shape

我看到了两种不同的模式和解释。一个来自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})
在支持第二个参数的环境中。