JavaScript原型继承

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

下面是一个简单的JavaScript继承示例。我们可以换一行吗:Dog.prototype=new Animal()
使用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检查编辑。“我很奇怪为什么我们需要创建一个新的动物对象”-良好的直觉。你。