gpt4 book ai didi

javascript - 为什么更改函​​数的 .prototype 会影​​响已使用该构造函数创建的对象的 "instanceof"

转载 作者:行者123 更新时间:2023-11-30 17:48:09 25 4
gpt4 key购买 nike

我试图做的是在 Javascript 中创建一个简单的对象层次结构,其中层次结构中的每个对象都有自己的一组属性,同时能够对这些新创建的对象使用 instanceof。换句话说,我希望我的基础对象(参见下面的 Person)实际包含 firstName 和 lastName 属性。我最终不希望我所有的属性都混入同一个“this”。我想要一个漂亮/整洁的真实对象层次结构。

为此,我认为这是正确的方法,但看起来我错了:

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__ 和 ninja3.__proto__ 对象将包含 firstName/lastName 属性(这就是我想要的)。这些 __proto__ 对象也属于“Person 类型”,因为它们是使用 Person 构造函数创建的,而 ninja1、ninja2 和 ninja3 对象属于“Ninja”类型(或者我认为是这样),因为它们是使用 Ninja 创建的构造函数。

我意识到通过 Person 构造函数将 Ninja.prototype 重新分配给新创建的对象是 instanceof 运算符的抛出,但对于我来说,我不知道为什么。

所以我有两个问题:

1) 为什么通过 Person 构造函数将 Ninja.prototype 重新分配给新创建的对象会抛出 instanceof 运算符?
2)做我想做的事情的正确方法是什么?换句话说,创建一个简单的对象层次结构,其中属性真正位于层次结构的不同级别,同时还能够以有意义的方式使用 instanceof

最佳答案

问题 1:为什么通过 Person 构造函数将 Ninja.prototype 重新分配给新创建的对象会抛出 instanceof 运算符?

这样做是因为 instanceof 运算符通过沿着原型(prototype)链向上移动并检查对象的内部实际原型(prototype) ([[Prototype]]) 是否与构造函数的当前原型(prototype)属性。

问题 2:做我想做的事情的正确方法是什么?换句话说,创建一个简单的对象层次结构,其中属性真正位于层次结构的不同级别,同时还能够以有意义的方式使用 instanceof

原型(prototype)适用于构造函数的所有实例共有的项目(例如,所有人都有大脑,但并非每个人都有相同的名字)。不要更改原型(prototype),而是直接添加名字和姓氏参数作为 Ninja 函数实例的属性,并使 Ninja 的原型(prototype)属性为空白 Person(涵盖没有姓名的人的情况,以便 instanceof 返回 true):

var Person = function (firstName, lastName)
{ this.firstName = firstName;
this.lastName = lastName;
}

var Ninja = function (beltColor, firstName, lastName)
{ this.beltColor = beltColor;
Person.call(this, firstName, lastName); // call parent function
}

Ninja.prototype = new Person("", ""); // do this so that instanceof returns true

var ninja1 = new Ninja ("Black", "George", "Clooney");
var ninja2 = new Ninja ("Blue", "Scarlett", "Johansson");
var ninja3 = new Ninja ("Green", "Brad", "Pitt");

console.log (ninja1 instanceof Ninja); // true
console.log (ninja1 instanceof Person); // true
console.log (ninja2 instanceof Ninja); // true
console.log (ninja2 instanceof Person); // true
console.log (ninja3 instanceof Ninja); // true
console.log (ninja3 instanceof Person); // true

关于javascript - 为什么更改函​​数的 .prototype 会影​​响已使用该构造函数创建的对象的 "instanceof",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19683444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com