js prototype constructor 简单直白的理解

一张图说明prototype与constructor

prototype

优先强调,constructor只是一个属性,并不是“构造函数”,只是默认情况下通过constructor属性引用“构造函数”,它们之间就是“变量名”和“对象”的关系,就是“姓名”和“人”的关系。

var i=1;
//i.constructor是Number
i.constructor=function(){}
//基本类型设置无效,i.constructor还是Number

function Person(){}
var tom=new Person();
//tom.constructor现在为Person,tom.hasOwnProperty('constructor')返回false
tom.constructor=function(){}
//tom.constructor现在变成自定义函数,tom.hasOwnProperty('constructor')返回true
Number.prototype.constructor=function(){}
//i.constructor变成了自定义函数。可见,constructor其实是原型的属性
Person.prototype={}
//此时tom.constructor还是Person。为什么呢?Person的原型不是没有任何属性吗?
//因为,Person的原型虽然变了,但是tom的原型没有变。Person的原型变化是因为修改了Person的prototype属性从而引用了另一个原型对象,但tom的原型还是原来的原型对象。
//pa为原来的原型对象,Person和tom的原型均为pa
//pb为Person的新原型对象,Person通过prototype属性指向pb,但是tom的原型还是pa,且不能修改tom使tom的原型指向pb

//另外,内置类型Number,String,Boolean,Array,Object等是不能直接设置prototype的
Number.prototype={} //无效,Number.prototype还是返回原来的Number实例对象

 

发表评论

电子邮件地址不会被公开。