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