我正在尝试做的是在 Javascript 中创建一个简单的对象层次结构,其中层次结构中的每个对象都有自己的一组属性,同时能够在这些新创建的对象上使用 instanceof。换句话说,我希望我的基础对象(参见下面的 Person)实际上包含 firstName 和 lastName 属性。我最终不希望我的所有属性都被捣碎到同一个“这个”上。我想要一个漂亮/整洁的真实对象层次结构。
为此,我认为这是正确的方法,但看起来我错了:
var Person = function (firstName, lastName)
{
this.firstName = firstName;
this.lastName = lastName;
}
var Ninja = function (beltColor)
{
this.beltColor = beltColor;
}
Ninja.prototype = new Person ("George", "Clooney");
var ninja1 = new Ninja ("Black");
Ninja.prototype = new Person ("Scarlett", "Johansson");
var ninja2 = new Ninja ("Blue");
Ninja.prototype = new Person ("Brad", "Pitt");
var ninja3 = new Ninja ("Green");
console.log (ninja1 instanceof Ninja); // false
console.log (ninja1 instanceof Person); // true
console.log (ninja2 instanceof Ninja); // false
console.log (ninja2 instanceof Person); // true
console.log (ninja3 instanceof Ninja); // true
console.log (ninja3 instanceof Person); // true
上面的代码(在我看来)将使用 Ninja 构造函数和结果有效地创建三个主要对象ninja1.__proto__, ninja2.__proto__ and ninja3.__proto__
对象将包含 firstName/lastName 属性(这是我想要的)。这些 __proto__ 对象也将属于“类型”Person,因为它们是使用 Person 构造函数创建的,而 ninja1、ninja2 和 ninja3 对象将属于“Ninja”类型(或者我认为),因为它们是使用 Ninja 创建的构造函数。
我意识到通过 Person 构造函数将 Ninja.prototype 重新分配给新创建的对象是instanceof
运算符的抛出,但对于我的生活,我不知道为什么。
所以我有两个问题:
1) 为什么通过 Person 构造函数将 Ninja.prototype 重新分配给新创建的对象会抛出instanceof
操作符?
2)做我想做的事情的正确方法是什么?换句话说,创建一个简单的对象层次结构,其中属性真正位于层次结构的不同级别,同时还能够以instanceof
有意义的方式使用?