組織函數建立對象帶來的題目
上一篇文章引見了JavaScript建立對象的幾種要領,都有各自的優缺點。
組織函數看起來彷佛很好,然則它也有一個題目,那就是建立出來的每一個實例對象的要領都是一個自力的函數,縱然他們的內容是完全相同的,這是不符合函數的代碼復用準繩的,而且也不能夠一致的修正已被建立的實例的要領。
function Person(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
this.introduce = function () {
console.log("我叫" + this.name + ", 本年" + this.age + "歲.");
};
}
var jerry = new Person("Jerry", "21", "M");
var julia = new Person("Julia", "27", "F");
console.log(jerry.introduce === julia.introduce); // false
上述代碼中的jerry對象和julia對象的introduce()
要領是兩個自力的函數,數據不同享,假如對象建立更多就浪費了大批的內存空間。
JavaScript原型處理方案
在 JavaScript 中,每當定義一個對象(函數也是對象)時刻,對象中都邑包括一些預定義的屬性。个中每一個函數對象
都有一個 prototype 屬性,這個屬性指向函數的原型對象。
那末,這個原型對象有什麼作用呢?
組織函數是一個函數對象
,所以就會有一個 prototype 屬性,也就有了一個原型對象,既然這是一個對象,那末久可認為它增加屬性和要領。而這個原型對象作為這個組織函數的一個屬性,是被其建立出來的一切實例同享的。
所以上面的代碼我們能夠如許改寫
function Person(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
Person.prototype.introduce = function () {
console.log("我叫" + this.name + ", 本年" + this.age + "歲.");
};
var jerry = new Person("Jerry", "21", "M");
var julia = new Person("Julia", "27", "F");
console.log(jerry.introduce === julia.introduce); // true
如許就處理了數據同享的題目,達到了代碼復用的目標,不管經由過程此組織函數建立了多少個對象,introduce 要領只會佔用一份內存空間。
且能夠一致修正一切 Person 組織函數建立的實例對象的 introduce 要領。
原型對象中的要領是能夠互相挪用的
function Dog(name, age) {
this.name = name;
this.age = age;
}
Dog.prototype.play = function () {
console.log("小狗遊玩");
this.bark();
};
Dog.prototype.bark = function () {
console.log("小狗叫");
};
var tom = new Dog("Tom", 3);
tom.play();// 小狗遊玩 小狗叫