javascript 对象继承如何工作?

How javascript object inheritance work?

我有以下代码

var createObj = function (prop1, prop2) {
   var obj = {
       prop1: prop1,
       prop2: prop2
   }
   Object.defineProperty(obj, "prop3", {
      get: function () {
          return this.prop1 + ' ' + this.prop2;
      },
      configurable: true
   });
   return obj;
}

var createSecObj = function () {
    var obj = createObj("prop1", "prop2");
    var prop3 = obj.prop3;

    Object.defineProperty(obj, "prop3", {
       get: function () {
           return prop3;
       }
    });
    return obj;
}

我正在尝试了解 javascript 继承的工作原理。

假设一个名为 myObj 的对象被创建为

myObj = createSecObj();

然后 myObj.prop3 的值将作为

记录到控制台
console.log(myObj.prop3) // "prop1 prop2"

然后使用

将 myObj.prop1 更改为 "blah"
myObj.prop1 = "blah"

如果 myObj.prop3 被记录到控制台,它会再次出现 "prop1 prop2"。而不是 "blah prop2".

 console.log(myObj.prop3) // results "prop1 prop2", expecting "blah prop2"

看起来 obj.prop3 仍然引用它的父对象。这是什么原因,即使它在子对象中重新定义。有人可以详细解释一下吗?

Looks like obj.prop3 still refer its parent object. what is the reason for this even it is redefined in child object.

这个问题与继承无关。问题是您用

覆盖了 prop3
var prop3 = obj.prop3; // var prop3 = "prop1 prop2";

Object.defineProperty(obj, "prop3", {
   get: function () {
       return prop3; // will always return "prop1 prop2"
   }
});

obj.prop3 将始终 return 变量 prop3 的值。变量 prop3 的值在整个应用程序中无法再更改,并且在创建它的那一刻,它的值是 "prop1 prop2".

我不清楚你想在这里实现什么,所以我不能真正提出解决方案。如果你想获得 "blah prop2" 那么只需从你的代码中删除上面的行。