这是JavaScript中的一个缺陷吗;s的原型继承模型?
我从John Resig的《JavaScript忍者的秘密》中学习了JavaScript中的原型继承,我想知道下面的代码示例(我刚刚编写)中会发生什么 据我所知,所有这些代码行的结果是变量这是JavaScript中的一个缺陷吗;s的原型继承模型?,javascript,inheritance,prototypal,Javascript,Inheritance,Prototypal,我从John Resig的《JavaScript忍者的秘密》中学习了JavaScript中的原型继承,我想知道下面的代码示例(我刚刚编写)中会发生什么 据我所知,所有这些代码行的结果是变量ninja1引用了一个Ninja对象,该对象通过其原型具有swingSword方法,通过Person的原型继承,具有sayHello方法 我感到困惑的是:由于属性swingSword(碰巧是一种方法)在将person实例分配给Ninja的原型之前就附加到了Ninja的原型上,swingSword属性/方法不会被
ninja1
引用了一个Ninja
对象,该对象通过其原型具有swingSword
方法,通过Person
的原型继承,具有sayHello
方法
我感到困惑的是:由于属性swingSword
(碰巧是一种方法)在将person实例分配给Ninja
的原型之前就附加到了Ninja
的原型上,swingSword
属性/方法不会被Person
实例的后续赋值覆盖吗?如果没有,那么Ninja
的prototype属性(它引用prototype对象)如何既引用Person
实例,又具有swingSword
属性
[…]通过它的原型,有了swingSword
方法,[…]
虽然这句话的其余部分是正确的,ninja1
引用了Ninja
(从技术上讲,Ninja.prototype
),并且通过继承将有一个sayHello
,但您以后关于swingSword
的想法是正确的
swingSword
属性/方法不会被Person
实例的后续赋值覆盖吗
在代码片段的末尾,ninja1.swingSword
应该是undefined
console.log(typeof ninja1.swingSword); // 'undefined'
// as is:
console.log(typeof Ninja.prototype.swingSword); // 'undefined'
在Ninja.prototype=…
之后,附加到swingSword
的原始prototype
对象不再被引用。因此,在创建新实例时不会使用它
如果您打算设置一个新的
原型
对象,您需要确保在修改它之前已经完成
Ninja.prototype = new Person();
Ninja.prototype.swingSword = function() {
alert("I can swing my sword.");
}
var ninja1 = new Ninja();
console.log(typeof ninja1.swingSword); // 'function'
而且,如果ninja1实际上有一个
swingSword
,这可能意味着它是在原型更改之前创建的
无论构造函数的prototype
属性如何更改,对象都会从创建时起保留自己的属性
Ninja.prototype.swingSword = function() {
alert("I can swing my sword.");
}
var ninja1 = new Ninja();
Ninja.prototype = new Person(); // won't affect existing instances
var ninja2 = new Ninja();
console.log(typeof ninja1.swingSword); // function
console.log(typeof ninja2.swingSword); // undefined
每个示例:您是否运行了代码?是什么让你认为《忍者1》
既有《说你好》又有《swingSword》?当你这样做的时候,忍者的原型就被完全覆盖了。Ninja.prototype=newperson()代码>。而ninja1
在本期结束时将不会有swingSword方法。这不是进行原型继承的方法。对于不强制您在其父代(新人)的Instance中创建的继承,您可以使用Ninja.prototype=Object.create(Person.prototype)代码>或辅助函数。这里有更多关于构造函数的内容:您没有使用特定于实例的成员,但如果使用,则应该执行Person.call(this)如果原型继承(比如在函数名、构造函数和new中使用大写字母来模拟类继承)对你来说真的很重要,那就放弃这本书吧。仅仅因为函数使用原型作为函数使用的关键词,并不意味着您完全掌握了对象原型的管理。
Ninja.prototype.swingSword = function() {
alert("I can swing my sword.");
}
var ninja1 = new Ninja();
Ninja.prototype = new Person(); // won't affect existing instances
var ninja2 = new Ninja();
console.log(typeof ninja1.swingSword); // function
console.log(typeof ninja2.swingSword); // undefined