javascript - 理解javascript继承

标签 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 继承属性。因此,当我从 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 from obj

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

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

So when I am inheriting obj2 from obj1 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/

相关文章:

c++ - 从基类方法返回对派生类的引用

c# - 如何在 Entity Framework 6 中混合使用 TPH 和 TPT?

javascript - 使用 Douglas Crockford 的函数继承在 Javascript 中调用基方法

c++ - "specialize"一个基对象变成派生对象?

javascript - 如何使用 Javascript 触发附加到 DOM 的元素上的 CSS3 转换?

javascript - Ember 数据关系表示 - 创建记录不起作用

javascript - 如何制作简单的 3 步结帐部分,例如测验

javascript - 使用 jQuery 拦截表单提交

javascript - 如何在回调中访问正确的“this”?

c# - 继承和构造函数中的错误