Javascript原型属性被遮蔽

时间:2016-01-26 16:42:35

标签: javascript prototype shadowing

我对Javascript原型机制有点困惑。我有以下代码:

# .htaccess
# Leverage Browser Caching
FileETag MTime Size
<ifmodule mod_expires.c>
    ExpiresActive on
    # if you want to change cache values per content-type
    #ExpiresByType image/jpg "access 7 day"
    #ExpiresByType text/css "access 7 day"
    ExpiresDefault "access plus 7 days"
</ifmodule>

执行代码后,对象有两个名称。名字&#34; Klaus&#34;在对象本身和名称&#34;没有名称&#34;在它的原型中。我知道该物业是阴影,它工作正常,但这并不自然?!有没有更好的方法只使用原型的属性?

1 个答案:

答案 0 :(得分:0)

您可以直接处理原型属性,但这需要不成比例的努力,可能不被视为最佳实践。相反,您可以在右Person上下文中调用this构造函数。

首先,强烈建议在分配函数的new属性时使用Object.create而不是prototype运算符。使用new运算符,将调用Person构造函数,但处于错误的this上下文中。为了防止这种情况,您可以像这样链接它们:

Student.prototype = Object.create(Person.prototype);

相反,如果你想在学生内部调用原型链接(Person)的构造函数,你可以call在构造函数中使用正确的this上下文:

function Student () {
  Person.call(this);
  this.id = "123";
}

此外,除非您想为每个实例创建单个函数,否则我会将setName函数移动到[[Prototype]]的{​​{1}}:

Person

或者,正如@Teemu所提到的,您还可以将function Person () { this.name = "no name"; } Person.prototype.setName = function (n) { this.name = n; } function Student () { Person.call(this); // Call the Person constructor this.id = "123"; } Student.prototype = Object.create(Person.prototype); s = new Student(); // s.name is 'no name' s.setName("Klaus"); // s.name is 'Klaus' 属性放在name上,以将其用作默认值:

Person.prototype