在Javascript中,为什么在构造函数上设置原型会改变其实例上的.constructor值?

时间:2014-04-18 10:01:02

标签: javascript

function Human(){
  this.job = 'code'
}

//Human.prototype = {feeds: 'Pizza'};

var developer = new Human();

console.log(developer.constructor);

控制台日志上方

function Human() {
this.job = 'code';
}

当我取消注释行Human.prototype = {feeds: 'Pizza'};时,它会控制台记录

function Object() {
  [native code]
}

为什么在构造函数上设置原型,会影响谁是构造函数创建的对象的构造函数?

另一个例子:

function LivingBeing() {
  breathes: 'air';
}

function Human(){
  feeds: 'Pizza';
}

//Human.prototype = new LivingBeing();

var developer = new Human();
console.log(developer.constructor);

评论说像构造函数是人类,当取消评论它说LivingBeing。为什么构造函数会在原型上找到有效的东西时进一步遍历?

我想再为此

添加一个级别
function AThing(){
  this.say = function(){return 'I am thing';};
}

function LivingBeing() {
  breathes: 'air';
}

LivingBeing.prototype = new AThing();

function Human(){
  feeds: 'Pizza';
}

Human.prototype = new LivingBeing();

var developer = new Human();
console.log(developer.constructor);

现在它说开发者的构造函数是AThing。我可以说构造函数在原型链中尽可能地走了吗?

2 个答案:

答案 0 :(得分:2)

developer没有名为constructor拥有属性,因此当您要求它时,它会在原型链中查找。由于原型是普通的Object,因此它的构造函数是默认的对象构造函数Object()

当您声明像function Human()这样的新函数时,JS会创建一个隐式对象并填充prototypeconstructor字段,如下所示:

X = {}
Human.prototype = X
X.constructor = Human

现在,当您撰写dev = new Human时,__proto__的内部dev属性设置为Xdev.constructor解析为X.constructor,这是Human

当您取消注释"披萨"行,代码变成以下内容:

Human.prototype = X
X.constructor = Human

pizza = {feeds:'Pizza'}
// pizza.__proto__ = {}
// pizza.constructor = pizza.__proto__.constructor = Object

Human.prototype = pizza
// note that pizza.constructor does NOT change

dev = new Human
// dev.__proto__ = Human.prototype = pizza

dev.constructor
// dev.constructor = dev.__proto__.constructor = pizza.constructor = pizza.__proto__.constructor = Object()

答案 1 :(得分:0)

什么是构造函数?

  

返回对创建实例的Object函数的引用   原型。请注意,此属性的值是对该引用的引用   函数本身,而不是包含函数名称的字符串。该   value仅对原始值(如1,true和)是只读的   “测试”。

第一种情况:

developer的构造函数是function Human(){this.job = "code";}

第二种情况:

由于您要将原型覆盖为对象,现在开发人员是Object {}的实例。

控制台显示任何本地全局对象,在javascript本身的实现中预定义为[native code]。那就是他们没有透露实施情况。