// 一、字面量 var o1 = {name:'lihaixing'}; var o11 = new Object({name:'lihaixing'}); // 二、构造函数 var M = function(){this.name='haixing'}; var o2 = new M(); // 三、基于原型 var P = {name:'haixing'}; var o3 = Object.create(P); var o33 = Object.create(null);
var M = function () { this.name = 'haixing'; // return {} }; var o2 = new M(); console.log(M.prototype.constructor === M); // true console.log(M.prototype === o2.__proto__); // true console.log(M.prototype.__proto__ === Object.prototype); // true console.log(M.__proto__ === Function.prototype); // true console.log(Object.prototype.__proto__===null); // true console.log(o2 instanceof M); // true console.log(M.prototype instanceof Object); // true console.log(o2 instanceof Object); // true 只要一条链上就能够
function Parent1 () { this.name = 'parent1' this.play = [1, 2, 3] } function Child1 () { Parent1.call(this) this.type = 'child1' }
缺点:只是将Parents的this指向了Child1的实例,但Parents.prototype中的属性却没法继承下来函数
// 测试 Parent1.prototype.say=function(){ console.log('Parent1 prototye') } var son1 = new Child1(); son1.say(); // Uncaught TypeError: son1.say is not a function
function Parent2 () { this.name = 'parent2' this.play = [1, 2, 3] } function Child2 () { this.type = 'child2' } Child2.prototype = new Parent2();
缺点:虽然实现了继承,可是父类实例后的数据倒是共用得,致使某个实例改变父亲的数据,其它儿子也就共享了测试
// 测试 Parent2.prototype.say = function () { console.log('say') } var son2 = new Child2(); var son22 = new Child2(); son2.say(); // say son2.play.push(4); console.log(son22.play); // [ 1, 2, 3, 4 ]
function Parent3 () { this.name = 'parent3' this.play = [1, 2, 3] } function Child3 () { Parent3.call(this) this.type = 'child3' } Child3.prototype = new Parent3()
缺点:虽然解决了各自的缺点,但父类执行了两次,而且父类和子类还有相同的属性this
function Parent4 () { this.name = 'parent4' this.play = [1, 2, 3] } function Child4 () { Parent4.call(this) this.type = 'child3' } Child4.prototype = Parent4.prototype
缺点:spa
// 测试 var son4 = new Child4(); // instanceof 取决于由谁建立的,同一条线均可 console.log(son4 instanceof Child4, son4 instanceof Parent4) // true true // 构造器在原型上呢,取决于Child4.prototype.contructor console.log(Child4.prototype.constructor, Parent4.prototype.constructor) // Parent4 Parent4
object.create
function Parent5 () { this.name = 'parent5' this.play = [1, 2, 3] } function Child5 () { Parent5.call(this) this.type = 'child5' } Child5.prototype = Object.create(Parent5.prototype); Child5.prototype.constructor = Child5;
最后一个比较完美,不说了prototype
var son5 = new Child5(); console.log(son5 instanceof Child5, son5 instanceof Parent5); // true true console.log(Child5.prototype.constructor,Parent5.prototype.constructor); // Child5 Parent5