我是JavaScript的新手,所以如果我误解了一个概念,请随时告诉我。
我有以下课程:
var Human = function () {};
Object.defineProperty(Human.prototype, 'name', {
get: function () { return this._name; },
set: function (value) { this._name = value; },
configurable: true,
enumerable: true
});
然后我定义了以下子对象:
var Man = function () {};
Man.prototype = new Human(); //Am I inherting Human's prototype (and properties) here?
Man.prototype.name = 'Matt'; //If so, I should be setting Man's name property (overriding the value inherited from Human)
但是,console.log(Man.name)
打印出""
。
为什么会这样,我如何才能正确覆盖Human
的属性?
PS :
我也试过
Man.name = 'Matt';
而不是
Man.prototype.Name = 'Matt';
但我也有同样的行为。
Ps2的:
我还应该注意,如果我执行console.log(Man.prototype._name)
,我会得到预期的输出"Matt"
答案 0 :(得分:2)
由于您正在设置prototype属性,因此需要从此构造函数中实例化一个新对象,然后使用prototype来构造新的对象实例:
var Man = function () {};
Man.prototype = new Human();
Man.prototype.name = 'Matt';
var man = new Man(); // <--- this is new man
console.log(man.name);
但是,您可能不希望所有Man
个实例具有相同的名称 - 当您将内容放入prototype
时会发生什么,它会被所有实例共享。这更有意义:
var Man = function () {};
Man.prototype = new Human();
var man = new Man();
man.name = 'Matt';
console.log(man.name);
在这里,您只需设置对象man
的拥有属性。