我正在学习 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
继承属性。因此,当我从 obj1
继承 obj2
时,它也应该继承 name 属性。请指导我哪里错了。
最佳答案
but when I am trying for
obj2.name
, I am getting error object is not a function.
不完全是。当您调用 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(…)
.
per my understanding
obj1
is inheriting properties fromobj
不,obj1
是一个实例。它本身确实有 .name
属性,它不继承它,而是拥有它。 obj
是作为实例初始化的一部分创建属性的构造函数。
obj1
确实从 obj.prototype
继承属性 - 因为您没有创建任何自定义属性,所以唯一继承的属性是 obj1.constructor
.
So when I am inheriting
obj2
fromobj1
it should inherit name property also.
如上所述,实际情况并非如此。 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
关于javascript - 理解javascript继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31024622/