因为 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 () {} };