關於javascript原型的修改與重寫(覆蓋)差別詳解_javascript技巧

來源:互聯網
上載者:User

每個JavaScript函數都有prototype屬性(javascript對象沒有這個屬性),這個屬性引用了一個對象,這個對象就是原型對象。javascript允許我們修改這個原型對象。

修改有2種方式:

方式1:在原有的原型對象上增加屬性或者方法

function Person(){}Person.prototype.add = function(){alert(this.name);};Person.prototype.name = "aty";var p1 = new Person();p1.add();//aty

方式2:重寫(覆蓋)原型對象

function Person(){}Person.prototype = {add : function(){alert(this.name);},name : "aty"}var p2 = new Person();p2.add();//aty

可以看到上面這2種方式都可以修改原型,那他們的差別究竟是什麼呢?到底哪種方式才是推薦的的做法呢?

function Person(){}function Animal(){}var person = new Person();var animal = new Animal();// 修改原型Person.prototype.say = function(){alert("person");}// 修改原型Animal.prototype = {say : function(){alert("person");}}person.say();//personanimal.say();//Uncaught TypeError: undefined is not a function

如果是先建立對象,然後再修改原型,那麼如果採用方式1,已經建立的對象能夠正確訪問修改後的原型;如果採用方式2,已經建立的對象無法訪問到修改後的原型。從這個角度來看,顯然方式1比方式2更好。為什麼會這樣呢?

 

function Person(){}function Animal(){}var person = new Person();var animal = new Animal();alert(person.__proto__ === Person.prototype);//truealert(animal.__proto__ === Animal.prototype);//true// 修改原型Person.prototype.say = function(){alert("person");}// 修改原型Animal.prototype = {say : function(){alert("person");}}alert(person.__proto__ === Person.prototype);//truealert(animal.__proto__ === Animal.prototype);//false

 很顯然這與java中"修改引用"和"修改引用指向的對象"很相似,效果也是一樣的。

以上這篇關於javascript原型的修改與重寫(覆蓋)差別詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援雲棲社區。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.