因爲 js 是解釋執行的語言, 那麼再代碼中出現函數與對象若是重複執行, 會建立多個副本javascript
// 1 function Person() { var o = {}; o.name = ... return o; } // 2 function Person () { name: .... age: .... ... }
// 1 function Person() { var o = {}; o.name = ... return o; } // 2 function Person () { name: .... age: .... ... }
function Foo() { this.sayHello = function () { } }
function Foo() { this.sayHello = function () { } }
new Foo()
所建立出來的. 所以每個對象在建立的時候, 函數 sayHello 都會被建立一次{} == {}
function sayHello () {} function Foo () { this.say = sayHello; }
function sayHello () {} function Foo () { this.say = sayHello; }
var f1 = new Foo(); var f2 = new Foo(); f1.sayHello(); // 若是 f1 沒有 sayHello, 那麼就會在 Foo.prototype 中去找 f2.sayGoodBye(); // 若是 f2 沒有改方法, 那麼就會在 Foo.prototype 中去找
var f1 = new Foo(); var f2 = new Foo(); f1.sayHello(); // 若是 f1 沒有 sayHello, 那麼就會在 Foo.prototype 中去找 f2.sayGoodBye(); // 若是 f2 沒有改方法, 那麼就會在 Foo.prototype 中去找
只須要將共享的東西, 重複會多佔用內存的東西放到 構造函數.prototype 中, 那麼全部的對象就能夠共享了.java
function Foo() {} Foo.prototype.sayHello = function () { console.log( ... ); }; var f1 = new Foo(); f1.sayHello(); var f2 = new Foo(); f2.sayHello(); f1.sayHello === f2.sayHello
function Foo() {} Foo.prototype.sayHello = function () { console.log( ... ); }; var f1 = new Foo(); f1.sayHello(); var f2 = new Foo(); f2.sayHello(); f1.sayHello === f2.sayHello
function Person() {} Person.prototype.name = '張三'; var p = new Person();
function Person() {} Person.prototype.name = '張三'; var p = new Person();
賦值的錯誤安全
function Person() {} Person.prototype.name = '張三'; var p1 = new Person(); var p2 = new Person(); p1.name = '李四'; console.log( p1.name ); console.log( p2.name ); // 若是是訪問數據, 當前對象中若是沒有該數據就到構造函數的原型屬性中去找 // 若是是寫數據, 當對象中有該數據的時候, 就是修改值; 若是對象沒有該數據, 那麼就添加值
function Person() {} Person.prototype.name = '張三'; var p1 = new Person(); var p2 = new Person(); p1.name = '李四'; console.log( p1.name ); console.log( p2.name ); // 若是是訪問數據, 當前對象中若是沒有該數據就到構造函數的原型屬性中去找 // 若是是寫數據, 當對象中有該數據的時候, 就是修改值; 若是對象沒有該數據, 那麼就添加值
// 在 java 中, 最小的代碼單位是 類 class Program { // 成員 }
// 在 java 中, 最小的代碼單位是 類 class Program { // 成員 }
爲何使用原型?框架
Student.prototype = { sayHello: function () {}, study: function () {} };
Student.prototype = { sayHello: function () {}, study: function () {} };