function Person() {//TODO} var p = new Person();
代码执行以前要经历一个预解析的过程。function Person(){}
是函数声明,p
也是声明(p 没有画出来),声明在预解析的时候完成。函数
因此,在代码开始运行时,构造函数 Person
在内存中已经存在了,因此代码运行起来第一句话是要执行var p = new Person();
程序开始执行spa
Person
初始化对象(给对象添加属性)/* 接上面的代码 */ Person.prototype.good = function() {console.log("好");} p.good(); //好
p
表示的对象默认链接到Person.prototype
,Person
类型对象中是不存在good
方法的,可是p
也能够访问到good
方法,因而可知,当当前对象中不存在某属性或方法时,会去神秘对象中去查找。因此能够说,当前对象(Person类型对象
)继承自神秘对象;也能够说,当前的实例对象,继承自其原型对象,这就是原型继承
。prototype
为何属性通常不放在原型上3d
为何方法能够放在原型上code
如何修改原型
一、 利用对象的动态特性对象
Student.prototype.sleep = function(){}
2 、利用直接替换blog
/* 构造函数.prototype.xxxx = vvvv */ /* 直接将原型进行了替换 */ Student.prototype = { sleep: function(){} study: function(){} }
function Person() {} Person.prototype.func = function () { console.log("11111"); }; var p1 = new Person(); Person.prototype = { func: function () { console.log("2222"); } }; var p2 = new Person(); p1.func(); p2.func();
Person
类型的对象的原型对象也指向匿名对象p1.func()
执行结果是1111
;p2.func()
执行结果是 2222
总结:只要对象建立出来了,即便原型属性被从新赋值,那么也不会影响已经建立好的对象的功能