js创建对象
创建对象的几种方式:
var o1 = {a:1};
var o2 = new Object({a: 1});
var o3 = Object.create({a:1});
var o4 = new Func('aa');
Object.create创建对象原理:
使用现有的对象来提供新创建的对象的__proto__
1 Object.create = function(o) { 2 function F(){} 3 F.prototype = o; 4 return new F(); 5 };
继承的几种方式
- 借助构造函数实现继承:call,apply原理:父级的构造函数的this指向子构造函数的实例,所以父级构造函数中的属性在子类中都有,缺点:父级原型链上的东西没有被子级继承。
- 借助原型链实现继承:child.prototype = new parent();缺点:实例s1.__proto__ === s2.__proto__。
- 组合继承:parent.call(this);child.prototype = new parent();缺点:父级构造函数执行多次
- 组合继承优化(父级构造体内的属性方法和其原型对象上的属性方法):parent.call(this);child.prototype = parent.prototype;缺点:child没有自己的constructor
- 组合继承优化终极版:parent.call(this);child.prototype = Object.create(parent.prototype);child.prototype.constructor = child;
new一个新对象时发生了什么
- 生成一个新对象
- 链接到原型
- 绑定this
- 返回新对象
1 function new2(func) { 2 var o = Object.create(func.prorotype); 3 var k = func.call(o); 4 if(k === 'object') { 5 return k; 6 } else { 7 return o; 8 } 9 }
1 function create() { 2 let obj = {}; 3 let Con = [].shift.call(arguments); 4 obj.__ptoto__ = Con.prototype; 5 let result = Con.apply(obj, arguments); 6 return result instanceof Object ? result : obj; 7 }
实现分析:
- 创建一个空对象
- 获取构造函数
- 设置空对象的原型
- 绑定this并执行构造函数
- 确保返回值为对象