首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Object.prototype和Function.prototype

Object.prototype和Function.prototype
EN

Stack Overflow用户
提问于 2016-11-24 07:17:08
回答 2查看 104关注 0票数 0

在JS中,函数被称为对象。现在,当针对对象测试函数时,它们的行为就不同了。

代码语言:javascript
复制
a = {};
console.log(a.prototype);   //undefined

function myFunc() {};
console.log(myFunc.prototype); //Object
Object.getPrototypeOf(myFunc); //function(){}

更糟糕的是,这篇MDN文章中的一个例子似乎改变了函数原型的构造函数。

secondConstructor.prototype.constructor = secondConstructor;

有人能解释一下这种行为吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-24 07:20:53

导致常见混淆的是,作为对象的函数具有.__proto__属性,而函数具有.prototype属性。它们有不同的含义。

大多数JavaScript对象都有一个原型对象,可以使用Object.getPrototypeOf()方法或简单的.__proto__属性来访问。这是用于重用代码的对象,当属性访问器无法在对象上找到所请求的属性时,将查询该对象,然后在其原型上查找该对象。这就是像.apply这样的常用方法在函数上可用的方式。在示例中,您是这样访问这个对象的:

代码语言:javascript
复制
Object.getPrototypeOf(myFunc); //function(){}

只有函数具有.prototype属性,当使用该函数创建新对象时,new运算符使用该属性。当用new操作符调用一个函数并创建一个新对象时,JS将检查该函数的.prototype属性。如果指向对象,JS将该对象设置为新创建对象的原型。这就是为什么在您的示例中对象的.prototypeundefined

代码语言:javascript
复制
a = {};
console.log(a.prototype); // undefined

有人能解释一下这种行为吗? secondConstructor.prototype.constructor = secondConstructor;

对象的constructor属性通常指向用于创建对象的函数。声明函数时,该属性将自动在函数的.prototype属性所指向的对象上创建。

代码语言:javascript
复制
function c() {}
c.prototype.constructor === c; // true
var o = new c();
o.constructor === c; // true

但是,可以很容易地更改此属性:

代码语言:javascript
复制
c.prototype = {constructor: function notCAnymore() {}}
var o = new c();
o.constructor === c; // false

现在我们不再引用正确的函数了。因此,在更改原型之后,我们可能需要还原.constructor属性:

代码语言:javascript
复制
c.prototype = {constructor: function notCAnymore() {}}
c.prototype.constructor = c; // restoring the correct constructor
var o = new c();
o.constructor === c; // true

这正是这个例子中所做的。原型改变如下:

代码语言:javascript
复制
secondConstructor.prototype = new firstConstructor;

如果现在创建了对象,那么指向正确构造函数的指针就会丢失:

代码语言:javascript
复制
var o = new secondConstructor();
o.constructor === secondConstructor; // false

这就是为什么他们使用这段代码来恢复它:

代码语言:javascript
复制
secondConstructor.prototype.constructor = secondConstructor;
var o = new secondConstructor();
o.constructor === secondConstructor; // true
票数 4
EN

Stack Overflow用户

发布于 2016-11-24 07:35:07

为你的第一次陈述

代码语言:javascript
复制
var a = {};
console.log(typeof(a));
console.log(Object.getPrototypeOf(a));

这里,a只是一个对象,当您检查它的类型时,它只返回对象,并且您不能访问它的原型。

所有JavaScript对象继承它们的原型的属性和方法。

使用对象文本或使用新对象()创建的对象从名为Object.prototype的原型继承

在第一种情况下,a只是对象文字,所以它的原型是空的。

在第二种情况下,myFunc是一个可以通过new创建对象的定义,但它也是一个对象,所以这就是为什么原型在这里是对象的原因。

-- Object.getPrototypeOf()方法返回指定对象的原型(即内部[原型]属性的值)。

对于MyFunc,原型是函数,因为它被定义为函数

代码语言:javascript
复制
function myFunc() {};
console.log(myFunc.prototype); //Object
console.log(Object.getPrototypeOf(myFunc));

在第三个片段中,是继承的情况。

代码语言:javascript
复制
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,请将其称为

代码语言:javascript
复制
child.prototype.constructor=parent;

希望它能帮上忙

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40780108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档