1

我试图理解javascript中的继承。我编写了一个基本示例来实现父对象和子对象之间的简单继承。但是我认为重置构造函数时有问题。

function Mammal(){
}
function Dog(){

}
Mammal.prototype.walk = function(){
    console.log('walking..walking....');
}
Dog.prototype.bark = function(){
    console.log('wof wof!');
}

Dog.prototype = Object.create(Mammal.prototype);
Dog.prototype.constructor = Dog;
let dogInstance = new Dog();
dogInstance.walk();
dogInstance.bark();

4

3 回答 3

0

问题在这里Dog.prototype = Object.create(Mammal.prototype);
试试

[编辑]

function Mammal() {}
function Dog() {}
Mammal.prototype.walk = function () {
    console.log( 'walking..walking....' );
};
Dog.prototype.bark = function () {
    console.log( 'wof wof!' );
};

[/编辑]

let describe = Object.getOwnPropertyDescriptor;
let descriptor = Object.keys( Mammal.prototype ).reduce( function ( desc, key ) {
    desc[key] = describe( Mammal.prototype, key );
    return desc;
}, {} );
Dog.prototype = Object.create( Dog.prototype, descriptor );

[编辑]

Dog.prototype.constructor = Dog;
let dogInstance = new Dog();
dogInstance.walk();
dogInstance.bark();

或者使用对象继承遵循这个

function Mammal( key ) { this.key = key; }
function Dog() {
    Mammal.call( this, "Dog" );
}
Dog.prototype = Object.create( Mammal.prototype );
Dog.prototype.bark = function () {
    console.log( 'wof wof!' );
};
Mammal.prototype.walk = function () {
    console.log( 'walking..walking....' );
    return `${this.key} from Mammal.`;
};
Dog.prototype.constructor = Dog;
let dogInstance = new Dog();
dogInstance.walk();
dogInstance.bark();

比较 dogInstance

 Mammal.prototype.isPrototypeOf( dogInstance );
 Dog.prototype.isPrototypeOf( dogInstance );

这对我有用:(

[/编辑]

于 2018-10-14T13:27:51.340 回答
0

我认为重置构造函数时有问题。

不,没有

你的问题是你做

Dog.prototype = Object.create(Mammal.prototype);

bark旧对象上创建方法之后Dog.prototype- 您正在用新的空对象覆盖它。只需在任何作业之前执行此操作:

function Mammal() {
}
Mammal.prototype.walk = function(){
    console.log('walking..walking....');
};

function Dog() {
}
Dog.prototype = Object.create(Mammal.prototype); // do this before creating properties
Dog.prototype.constructor = Dog;
Dog.prototype.bark = function() {
    console.log('wof wof!');
};
于 2018-10-14T14:30:49.540 回答
-1

我对此并不完全确定,但这条线是问题所在:

Dog.prototype = Object.create(Mammal.prototype);

显然你不能把 Mammal 原型直接给 Dog 原型

function Mammal() {
}
function Dog() {

}
Mammal.prototype.walk = function () {
	console.log( 'walking..walking....' );
}
Dog.prototype.bark = function () {
	console.log( 'wof wof!' );
}

Dog.prototype.mammal = Object.create( Mammal.prototype );
Dog.prototype.constructor = Dog;
let dogInstance = new Dog();
dogInstance.mammal.walk();
dogInstance.bark();

这似乎有效

于 2018-10-14T12:45:56.407 回答