在JS中,函数被称为对象。现在,当针对对象测试函数时,它们的行为就不同了。
a = {};
console.log(a.prototype); //undefined
function myFunc() {};
console.log(myFunc.prototype); //Object
Object.getPrototypeOf(myFunc); //function(){}更糟糕的是,这篇MDN文章中的一个例子似乎改变了函数原型的构造函数。
secondConstructor.prototype.constructor = secondConstructor;
有人能解释一下这种行为吗?
发布于 2016-11-24 07:20:53
导致常见混淆的是,作为对象的函数具有.__proto__属性,而函数具有.prototype属性。它们有不同的含义。
大多数JavaScript对象都有一个原型对象,可以使用Object.getPrototypeOf()方法或简单的.__proto__属性来访问。这是用于重用代码的对象,当属性访问器无法在对象上找到所请求的属性时,将查询该对象,然后在其原型上查找该对象。这就是像.apply这样的常用方法在函数上可用的方式。在示例中,您是这样访问这个对象的:
Object.getPrototypeOf(myFunc); //function(){}只有函数具有.prototype属性,当使用该函数创建新对象时,new运算符使用该属性。当用new操作符调用一个函数并创建一个新对象时,JS将检查该函数的.prototype属性。如果指向对象,JS将该对象设置为新创建对象的原型。这就是为什么在您的示例中对象的.prototype是undefined
a = {};
console.log(a.prototype); // undefined有人能解释一下这种行为吗? secondConstructor.prototype.constructor = secondConstructor;
对象的constructor属性通常指向用于创建对象的函数。声明函数时,该属性将自动在函数的.prototype属性所指向的对象上创建。
function c() {}
c.prototype.constructor === c; // true
var o = new c();
o.constructor === c; // true但是,可以很容易地更改此属性:
c.prototype = {constructor: function notCAnymore() {}}
var o = new c();
o.constructor === c; // false现在我们不再引用正确的函数了。因此,在更改原型之后,我们可能需要还原.constructor属性:
c.prototype = {constructor: function notCAnymore() {}}
c.prototype.constructor = c; // restoring the correct constructor
var o = new c();
o.constructor === c; // true这正是这个例子中所做的。原型改变如下:
secondConstructor.prototype = new firstConstructor;如果现在创建了对象,那么指向正确构造函数的指针就会丢失:
var o = new secondConstructor();
o.constructor === secondConstructor; // false这就是为什么他们使用这段代码来恢复它:
secondConstructor.prototype.constructor = secondConstructor;
var o = new secondConstructor();
o.constructor === secondConstructor; // true发布于 2016-11-24 07:35:07
为你的第一次陈述
var a = {};
console.log(typeof(a));
console.log(Object.getPrototypeOf(a));
这里,a只是一个对象,当您检查它的类型时,它只返回对象,并且您不能访问它的原型。
所有JavaScript对象继承它们的原型的属性和方法。
使用对象文本或使用新对象()创建的对象从名为Object.prototype的原型继承
在第一种情况下,a只是对象文字,所以它的原型是空的。
在第二种情况下,myFunc是一个可以通过new创建对象的定义,但它也是一个对象,所以这就是为什么原型在这里是对象的原因。
-- Object.getPrototypeOf()方法返回指定对象的原型(即内部[原型]属性的值)。
对于MyFunc,原型是函数,因为它被定义为函数
function myFunc() {};
console.log(myFunc.prototype); //Object
console.log(Object.getPrototypeOf(myFunc));
在第三个片段中,是继承的情况。
function parent(name){
this.name=name;
}
function child(childname){
this.childname=childname;
}
child.prototype=Object.create(parent.prototype);
console.log(parent.prototype);
console.log(parent.prototype.constructor);
console.log(child.prototype);
console.log(child.prototype.constructor);
当子继承父级时,它的原型和构造函数是父级的,为了将构造函数更改为相同的MDN,请将其称为
child.prototype.constructor=parent;希望它能帮上忙
https://stackoverflow.com/questions/40780108
复制相似问题