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
總結:只要對象建立出來了,即便原型屬性被從新賦值,那麼也不會影響已經建立好的對象的功能