Javascript Object.create不是从父级继承的

时间:2016-02-07 08:30:39

标签: javascript object prototypal-inheritance

我希望man对象继承自person对象。我可以使用new运算符完成它,但它应该与Object.create一起使用。但为什么它不起作用? console.log代表undefined而不是预期的hello

function person() {
    this.say="hello";
}

function man() {
    this.name="John Miler";
}

man.prototype = Object.create(person);

var Johnny = new man();

console.log(Johnny.say);  

3 个答案:

答案 0 :(得分:3)

你的问题是双重的。

问题1:

Object.create应该传递prototype,而不是构造函数。在这种情况下,您应该使用Object.create(person.prototype);,而不是Object.create(person);

问题2:

调用构造函数时会添加say属性,而您永远不会从子构造函数中调用父构造函数。

根据您的行为,有几种方法可以解决这个问题。

选项1,call父构造函数。

person.call(this);

示例:



function person() {
    this.say="hello";
}

function man() {
    person.call(this);
    this.name="John Miler";
}

man.prototype = Object.create(person.prototype);

var Johnny = new man();

console.log(Johnny.say);  




选项2,使其成为静态属性。

person.prototype.say = "hello";

示例:



function person() {
}
person.prototype.say = "hello";

function man() {
    this.name="John Miler";
}

man.prototype = Object.create(person.prototype);

var Johnny = new man();

console.log(Johnny.say);  




答案 1 :(得分:0)

如果您尝试实现的是man对象继承person对象,请尝试:

// superclass
function Person() {
  this.say = "hello";
}

// superclass method
Person.prototype.doStuff = function() {
  console.info('Stuff done.');
};

// subclass
function Man() {
  Person.call(this); // call super constructor.
  this.name="John Miler";
}

// subclass extends superclass
Man.prototype = Object.create(Person.prototype);
Man.prototype.constructor = Man;


var Johnny = new Man();

console.log(Johnny.say); // hello

答案 2 :(得分:0)

Object.create应该传递给原型而不是构造函数。

function person() {
 this.say="hello";
}

function man() {
 this.name="John Miler";
}

man.prototype = Object.create(new person());

var Johnny = new man();

console.log(Johnny.say);