Javascript 为什么util.inherits创建一个从超级构造函数';什么是原型?
在forJavascript 为什么util.inherits创建一个从超级构造函数';什么是原型?,javascript,node.js,inheritance,prototype,Javascript,Node.js,Inheritance,Prototype,在forutil.inherits中,他们调用object.create来创建一个新对象,其原型是超级构造函数的原型 ctor.prototype = Object.create(superCtor.prototype, { constructor: { value: ctor, enumerable: false, writable: true, configurable: true } }); 为什么会这样?为什么不干脆做: ctor.prototy
util.inherits
中,他们调用object.create
来创建一个新对象,其原型是超级构造函数的原型
ctor.prototype = Object.create(superCtor.prototype, {
constructor: {
value: ctor,
enumerable: false,
writable: true,
configurable: true
}
});
为什么会这样?为什么不干脆做:
ctor.prototype = superCtr.prototype?
为什么不直接做:ctor.prototype=superCtr.prototype
这意味着,每当有人向ctor.prototype
添加方法时,他们最终也会向supercr.prototype
添加方法,因为它们是相同的对象
那太可怕了!这意味着,如果您从EventEmitter
继承了例如http.IncomingMessage
,那么http.IncomingMessage.prototype
上的每个方法都将在EventEmitter.prototype
上结束。因此,所有io.js中的每个事件发射器上都有与HTTP相关的方法
相反,我们创建了一个新对象,可以向其中添加特定于ctor
实例的方法。由于我们确保新对象是object.create
d fromsupercor.prototype
,因此我们知道,对该对象的任何查找都将遵循[[prototype]]链,并从supercor.prototype
中查找方法,正如您在继承时所期望的那样。但它是一个新对象,有自己定制的空间,正如您所希望的那样
为什么不直接做:ctor.prototype=superCtr.prototype
这意味着,每当有人向ctor.prototype
添加方法时,他们最终也会向supercr.prototype
添加方法,因为它们是相同的对象
那太可怕了!这意味着,如果您从EventEmitter
继承了例如http.IncomingMessage
,那么http.IncomingMessage.prototype
上的每个方法都将在EventEmitter.prototype
上结束。因此,所有io.js中的每个事件发射器上都有与HTTP相关的方法
相反,我们创建了一个新对象,可以向其中添加特定于ctor
实例的方法。由于我们确保新对象是object.create
d fromsupercor.prototype
,因此我们知道,对该对象的任何查找都将遵循[[prototype]]链,并从supercor.prototype
中查找方法,正如您在继承时所期望的那样。但它是一个新对象,有自己定制的空间,正如您所希望的那样
为什么不直接做:ctor.prototype=superCtr.prototype
这意味着,每当有人向ctor.prototype
添加方法时,他们最终也会向supercr.prototype
添加方法,因为它们是相同的对象
那太可怕了!这意味着,如果您从EventEmitter
继承了例如http.IncomingMessage
,那么http.IncomingMessage.prototype
上的每个方法都将在EventEmitter.prototype
上结束。因此,所有io.js中的每个事件发射器上都有与HTTP相关的方法
相反,我们创建了一个新对象,可以向其中添加特定于ctor
实例的方法。由于我们确保新对象是object.create
d fromsupercor.prototype
,因此我们知道,对该对象的任何查找都将遵循[[prototype]]链,并从supercor.prototype
中查找方法,正如您在继承时所期望的那样。但它是一个新对象,有自己定制的空间,正如您所希望的那样
为什么不直接做:ctor.prototype=superCtr.prototype
这意味着,每当有人向ctor.prototype
添加方法时,他们最终也会向supercr.prototype
添加方法,因为它们是相同的对象
那太可怕了!这意味着,如果您从EventEmitter
继承了例如http.IncomingMessage
,那么http.IncomingMessage.prototype
上的每个方法都将在EventEmitter.prototype
上结束。因此,所有io.js中的每个事件发射器上都有与HTTP相关的方法
相反,我们创建了一个新对象,可以向其中添加特定于
ctor
实例的方法。由于我们确保新对象是object.create
d fromsupercor.prototype
,因此我们知道,对该对象的任何查找都将遵循[[prototype]]链,并从supercor.prototype
中查找方法,正如您在继承时所期望的那样。但它是一个新对象,有自己定制的空间,正如您所希望的。原型继承就是这样工作的<代码>原型!=[[Prototype]]Object.create
设置内部属性。这只是一种分配。@DanielA.White他们这样做的方式不也只是一种分配吗?他们只是创建了一个新对象,它的原型就是我们要找的,不是吗?原型继承就是这样工作的<代码>原型!=[[Prototype]]Object.create
设置内部属性。这只是一种分配。@DanielA.White他们这样做的方式不也只是一种分配吗?他们只是创建了一个新对象,它的原型就是我们要找的,不是吗?原型继承就是这样工作的<代码>原型!=[[Prototype]]Object.create
设置内部属性。这只是一种分配。@DanielA.White他们这样做的方式不也只是一种分配吗?他们只是创建了一个新对象,它的原型就是我们要找的,不是吗?原型继承就是这样工作的<代码>原型!=[[Prototype]]Object.create
设置内部属性。这只是一种分配。@DanielA.White他们这样做的方式不也只是一种分配吗?他们只是创造了一个新的物体,它的原型就是我们要找的,不是吗?这是有道理的。非常感谢。这是有道理的。非常感谢。这是有道理的。非常感谢。这是有道理的。非常感谢。