如何从构造函数内部的原型对象中检索属性

时间:2016-05-28 06:41:16

标签: javascript oop

我认为这个问题解释了。我正在尝试检索位于构造函数对象内的原型对象内部的特定属性。如果我无法找回它,我希望有人能解释为什么我不能。以下是jsfiddle

的代码

的Javascript

function animal() {
    this.name = "animal";
    this.action = "acting";
    this.active = function () {
        var txt = "This " + this.name + ", is " + this.action;
        attach('ex1', txt, 'p');
    }

}

function print(value) {
    document.getElementById('ex1').innerHTML += value;
}

function Human() {
    animal.call(this);

    Human.prototype = {
        name: "human",
        action: "conquering"

    }

}



var bob = new Human;

print(bob.name);

2 个答案:

答案 0 :(得分:1)

这很简单,你用动物来掩饰名字。 属性提取的工作方式如下。 当你调用obj.x时,它会在obj中查找名为x的属性。如果找到它,则返回该属性的值,否则它在构造函数proptotype中查找属性x,如果找到它则返回它。如果它没有找到它,它会在原型对象构造函数原型中查找,依此类推,直到最后一个原型为Object {}。如果找不到,则返回undefined。

有关详情,请点击此处: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain

所以在你的情况下,bob有属性名称,它的值是动物。在人类控制器中调用了上下文设置为动物函数的动物函数时,将此属性添加到bob。

也许这个例子可以帮助你更好地理解原型链:



function A() {
  this.x2 = 2;
}

A.prototype.x3 = 3;

function B() {
  this.x1 = 1;
}
B.prototype = new A();

const b = new B();
const b2 = new B();
b2.x3 = 'something';

console.log(b.x1); //found on b
console.log(b.x2); //found on B.prototype
console.log(b.x3); //found on A.prototype
console.log(b2.x3); //shadowed by b2.x3




答案 1 :(得分:1)

为什么您无法检索原型的对象属性,该对象属性与初始对象的现有属性具有相同的名称:

  

...
  在对象上读取属性时,首先是JavaScript引擎   寻找具有该名称的自有财产。如果发动机找到了   正确命名自己的属性,它返回该值。如果没有自己   具有该名称的属性存在于目标对象JavaScript上   搜索[[Prototype]]对象。如果是原型属性   如果存在该名称,则返回该属性的值。如果   搜索结束时没有找到具有正确名称的属性,    undefined 将被返回。

     
    
      

来自面向对象JavaScript的原则/ Nicholas C. Zakas