理解javascript继承

时间:2015-06-24 10:52:50

标签: javascript inheritance

我正在学习javascript继承,所以我正在尝试以下代码:

var obj = function(name) {
  this.name=name
};

var obj1 = new obj("suman"); 
console.log(obj1.name); 

var obj2 = new obj1("sonali"); 
console.log(obj2.name);

但是当我尝试获取obj2.name时,我收到以下错误object is not a function

根据我的理解,var obj1继承了obj的属性。因此,当我从obj2继承obj1时,它也应该继承name属性。请指导我错在哪里。

2 个答案:

答案 0 :(得分:4)

  

但是当我尝试obj2.name时,我得到的错误对象不是函数。

不完全是。当您致电var obj2=new obj1("sonali");时,您会收到该错误 - 其中obj1是第一个实例,而不是您的构造函数。使用

var obj2 = new obj("sonali");
console.log(obj2.name); // works as expected

为了更好的可读性,约定是大写构造函数的名称,因此function Obj(name){…}var obj = new Obj(…)

  

根据我的理解obj1继承了obj

的属性

不,obj1实例。它确实拥有.name属性,它不会继承它,它拥有它。 obj创建属性的构造函数,作为实例初始化的一部分。

obj1确实从obj.prototype继承了属性 - 因为您没有创建任何自定义属性,所以唯一的继承属性是obj1.constructor

  

因此,当我从obj2继承obj1时,它也应该继承name属性。

如上所述,这不是正在发生的事情。 obj1不是构造函数,您无法使用new调用它。我打赌我现在很困惑你,但你仍然可以从obj1实例对象继承:使用Object.create。让我们从

开始
function Obj(name) {
  this.name = name;
}
var obj1 = new Obj("suman"); // or alternatively:
obj1 = Object.create(Obj.prototype); obj1.name = "suman";

console.log(obj1.name); // suman

现在我们可以创建一个新对象,从第一个对象继承prototypically

var obj2 = Object.create(obj1);
console.log(obj2.name); // suman - inherited!
console.log(obj2.hasOwnProperty("name")); // false - it's inherited!

但现在我们也可以给它一个自己的名字:

obj2.constructor("sonali"); // which executes the following:
obj2.name = "sonali"; // pretty equivalent

console.log(obj2.name); // sonali

答案 1 :(得分:2)

你混淆了“类”和“实例”的概念,这些概念在面向对象的文献中具有特定的含义。

在您的示例中,obj指的是类/原型,或者广泛地说,是一个“模板”,用作创建副本的参考。 使用new运算符在语句中提供的对象引用是为类创建的“实例”。所以,obj1是一个有效的实例。

因此,只能实例化类而不是实例。 回答实例化一个类的问题不会导致孩子“继承”进一步实例化的能力。

因此,您希望创建的对象应始终在使用new关键字调用构造函数时引用您要使用的“类”。