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一个新对象时发生了什么

  1. 生成一个新对象
  2. 链接到原型
  3. 绑定this
  4. 返回新对象
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并执行构造函数
  • 确保返回值为对象

 

posted @ 2019-10-30 08:27  朵拉.科波菲尔  阅读(254)  评论(0编辑  收藏  举报