我正在学习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属性。请指导我错在哪里。
答案 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关键字调用构造函数时引用您要使用的“类”。