JavaScript原型继承
下面是一个简单的JavaScript继承示例。我们可以换一行吗:Dog.prototype=new Animal()JavaScript原型继承,javascript,inheritance,prototype,prototypal-inheritance,Javascript,Inheritance,Prototype,Prototypal Inheritance,下面是一个简单的JavaScript继承示例。我们可以换一行吗:Dog.prototype=new Animal() 使用Dog.prototype=Animal.prototype 我在浏览器中进行了测试,他们给了我相同的结果。我很奇怪,为什么我们需要创建一个新的动物对象并将其分配给Dog.prototype function Animal(age){ this.age = age; } Animal.prototype.walk = function(){ console
使用Dog.prototype=Animal.prototype 我在浏览器中进行了测试,他们给了我相同的结果。我很奇怪,为什么我们需要创建一个新的动物对象并将其分配给Dog.prototype
function Animal(age){
this.age = age;
}
Animal.prototype.walk = function(){
console.log("Walk");
}
function Dog(color, age){
this.color = color;
Animal.call(this, age)
}
Dog.prototype = new Animal(); //Why not Dog.prototype = Animal.prototype
Dog.prototype.constructor = Dog;
dog_b = new Dog("yellow", 9);
console.log("Age: " + dog_b.age + " Color: " + dog_b.color );
dog_b.walk()
在这种特殊情况下,您可以出于一个简单的原因更换线路:
function Dog(color, age) {
this.color = color;
Animal.call(this, age); // This line
}
在这里,您通过call
调用Animal的构造函数来提供它this
,从而手动建立Animal的上下文。所以这个里面的功能动物
总是指狗
的对象。这就是为什么一个新的根本不会有什么不同
严格地说,您实际上并没有进行正确的原型继承。您可以通过执行以下操作来确认:
dog_b.hasOwnProperty('age'); // => true
这实际上被称为构造器偷窃
,其中狗
偷窃动物
的构造器。然而,walk
方法在Animal
的ctor上
这意味着age
属性在Dog
本身上,而不是在Animal
上。为什么呢?同样,因为您正在手动将动物的构造函数上下文建立为狗的构造函数上下文
编辑:
在Javascript中,有各种描述和实现继承的方法,因为这里不是写书的地方,所以我会很快写下来
你所做的就是所谓的寄生组合继承(你不必记住这个术语)。这并没有错,这只是获得继承的另一种方式(仅对Animal.prototype
上的函数是原型)。如果对你有用的话,我会说拿着它。如果您真的希望Animal
的age
在Animal
上,那么在使用构造函数获取继承时将面临问题
一种方法是:
function inherit(o){
function F(){}
F.prototype = o;
return new F();
}
var foo = {
name: 'some'
}
var bar = inherit(foo); // bar.name refers to the object on foo
正如您所见,原型继承通常用于对象文本(想想angular的scope object)。那么,在不窃取构造函数的情况下编写Dog()构造函数的正确方法是什么呢?我不确定您的第一行。你是否建议这两个Dog.prototype=new Animal()代码>和Dog.prototype=Animal.prototype
可以吗?甚至,他们做同样的事情?我从来没有听说过“构造函数盗窃”这个词。鉴于狗
应该继承自动物
,这只是一个调用。@Bergi我只是说替换该行的最终结果是相同的(几乎相同)。我认为这个词并不常见,但我读过的几本书中都写过。OP检查编辑。“我很奇怪为什么我们需要创建一个新的动物对象”-良好的直觉。你。