標籤:error define 建立 span var asc anim als script
每一個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原型的改動與重寫(覆蓋)區別