Javascript instanceof operator confusion
我读过有关javascript的instanceof操作符的文章,想测试一下。我写了这段代码:
1 2 3 4 5 6 7 8 9 10 11 12 13
| function first() {};
first.prototype.hello = function hello() {
console.log("hello");
}
var second = {};
second.prototype = Object.create(first.prototype);
console.log(second instanceof first); //should've output true
second.hello(); |
这不符合我的预期。我在写这篇文章时的想法是:
instanceof将函数(本例中的first作为其右操作数,对象作为其左操作数。然后检查给定函数的原型是否出现在对象原型链的任何部分中。first是函数,hello是添加到first原型中的函数。second的原型被分配了一个新的对象,该对象有一个到first.prototype的原型链接,因此在执行second instanceof first时,它不能直接在second上找到到first.prototype对象的链接,因此它跟随原型链接到具有该链接的second.prototype上。
当我在chrome中运行这个命令时,结果是:
1 2 3 4
| false
Uncaught TypeError: second.hello is not a function
at main.js:13 |
你能帮我一下吗?
- second = new first()有什么问题?这不是你想要实现的吗?这种模式似乎试图将first子类划分为second类,但你"做错事了"?
- 我不认为构造函数调用版本有什么WRON,但这不是一个实用的代码,它只是为了测试我学到的东西而编写的。
- 关于图像,请将它们限制在真正需要图像的地方。如果您在问题"second instanceof first返回false,second.hello()生成Uncaught TypeError: second.hello is not a function",并在代码中指明相应的行,我们将非常愿意。
second's prototype is assigned a new object
不,这部分错了。您正在创建一个名为"prototype"的属性,但这并不意味着它是对象的实际原型。
1 2
| var second = {};
second.prototype = ... |
等于
1
| var second = {"prototype": ... }; |
但这与继承无关。
几乎唯一使用名为"prototype"的属性的地方是构造函数函数(如first上),即使这样,它也不被用作函数本身的原型;它被用作以后从new ThatFunction()创建的任何实例的原型。
你能做的就是
1 2 3 4 5 6 7 8
| var second = new first;
// What this does:
// - gets the object from first.prototype
// - creates a new derived object, like Object.create(first.prototype)
// - calls first(), passing the new object as 'this',
// like first.call(Object.create(first.prototype))
// - assigns the object returned from first() to second
// (if first doesn't return an object, it automatically uses the new object created in step 2 instead) |
或(大部分相当,但不会称为first)
1
| var second = Object.create(first.prototype); |
- So the actual prototype cannot be referenced with the expression EDOCX1
- @Brantran that is correct.你可以用字母名称1来形容它
- Just to anyone who may read this later:my mistake was not get the meaning of the EDOCX1.It(by default)exists only for functions and is a link to some other object.3.Using it for non-silable object's property is the same a s just adding a new property on it(without any special meaning).谢谢你的支持!
用second代替second.prototype。
我已经编辑了你的代码。
4
- I've actually tried this too and when it worked I was confused even more
Object.create ()返回需要存储在second变量中而不是second.prototype中的已创建对象。它不返回对象原型,而是返回整个对象本身。
1 2
| var second = {}
second = Object.create (first.prototype) |