new一个对象的过程

new的原理


function Person () {
    this.name = name;
    this.age = age;
    this.sex = sex
 
    this.sayName = function () {
        return this.name;
    };
}
 
var person = new Person("tom", 21, "famle");
 
console.log(person.name);
  • 创建一个空对象
var obj = new Object();
  • 让Person中的this指向obj,并执行Person的函数体
var result = Person.call(obj);
  • 设置原型链,将obj的__proto__成员指向了Person函数对象的prototype成员对象
obj.__proto__ = Person.prototype;
  • 判断Person的返回值类型,如果是值类型,返回obj。如果是引用类型,就返回这个引用类型的对象。
if (typeof(result) == "object")
  person = result;
else
  person = obj;

手动实现new

// 通过分析原生的new方法可以看出,在new一个函数的时候,会返回一个func同时在这个func里面会返回一个对象Object,这个对象包含父类func的属性以及隐藏的__proto__

function New(f) {
    //返回一个func
    return function () {
        var o = {"__proto__": f.prototype};
        f.apply(o, arguments);//继承父类的属性
        return o; //返回一个Object
    }
}
comments powered by Disqus