Sunshine168 / resume

My resume
3 stars 1 forks source link

对象创建 #7

Open Sunshine168 opened 6 years ago

Sunshine168 commented 6 years ago

工厂模式

function createPerson(name,age,job){
    var o = new Object()
    o.name = name 
    o.age = age
    o.job = job
    o.sayName = function(){
        alert(this.name)
    }
}

缺点: 不能知道通过工厂产生的对象的类型。

构造函数

function Person(name,age,job){
    this.name = name
    this.age = age
    this.job = job
    this.sayName = function(){
        alert(this.name)
    }
}

对比不同之处

使用构造函数创建 => 使用new操作符,实际上是经历了

  1. 创建一个新对象
  2. 将构造函数的作用域赋予新对象(this就指向了这个新对象)
  3. 执行构造函数中的代码(为这个对象添加属性)
  4. 返回新对象

抛砖引玉实现一个new

new


function simulateNew(){
    var object = new Object(),// 创建一个对象
    Constructor = [].shift.call(arguments)//取出构造函数和参数
    object.__proto__ = Constructor.prototype//链接上原型链
   /*
    * 将构造函数的作用域赋予新对象(this就指向了这个新对象)
    * 执行构造函数中的代码(为这个对象添加属性)
    */
    var temp =Constructor.apply(object,arguments)
    return typeof temp === 'object'? temp : object
}

Object.create()

Object.create()

使用null的时候代表从Object的原型上直接继承

There's a difference here, with Object.create you can create an object that doesn't inherit from anything, Object.create(null);, on the other hand, if you set SomeConstructor.prototype = null; the newly created object will inherit from Object.prototype.


function objectFactory() {
var args = Array.prototype.slice.call(arguments);
var Constructor = args.shift();
var instance = Object.create(Constructor.prototype);
var temp = Constructor.apply(instance, args);

return (typeof temp === 'object' && temp !== null) ? temp : instance; }


---
参考资料
* [JavaScript深入之new的模拟实现](https://github.com/mqyqingfeng/Blog/issues/13) 
* 高程第三版6.2创建对象