新しい原理と実装

新しいプロセス

// new运算的过程
/**
 * 1、创建一个空对象;
 * 2、该空对象的原型指向构造函数(链接原型):将构造函数的 prototype 赋值给对象的 __proto__属性;
 * 3、绑定 this:将对象作为构造函数的 this 传进去,并执行该构造函数;
 * 4、返回新对象:如果构造函数返回的是一个对象,则返回该对象;否则(若没有返回值或者返回基本类型),返回第一步中新创建的对象;
 */
var Person = function(name) {
    this.name = name
    console.log('name is ', this.name)
}
Person.prototype.getName = function() {
    return this.name
}
var objectFactory = function() {
    // 1、创建一个空对象
    var obj = new Object()
    console.log('before shift arguments = ',arguments)
    // 获取构造函数Person
    Constructor = [].shift.call(arguments)
    //因为arguments是类数组,并不是真正的数组,所以不能直接调用数组的shift方法,但是可以通过call调用。
    console.log('after shift arguments = ', arguments)
    console.log(`Constructor = ${Constructor}`)
    // 2、该空对象的原型指向构造函数: 将构造函数的prototype 赋值给空对象的 __proto__属性;
    obj.__proto__ = Constructor.prototype
    // 3、将空对象作为构造函数的this传进去,并执行该构造函数
    var ret = Constructor.apply(obj, arguments)
    // 4、返回新对象:如果构造函数返回的是一个对象,则返回该对象;否则(若没有返回值或者返回基本类型),返回第一步中新创建的对象;
    return typeof ret == 'object' ? ret : obj
}
var a = objectFactory(Person, 'wyh')
console.log('执行后的name = ', a.name)

新しい説明を達成するための第四段階:

コンストラクタの戻り値は、次の3つの場合です:

  • 図1に示すように、オブジェクトを返します
  • 2、ノーreturn、そのリターンundefined
  • 3、への復帰undefinedを除いて、基本的なタイプ

ケース1:オブジェクトを返します。

function Car(color, name) {
    this.color = color;
    return {
        name: name
    }
}

var car = new Car("black", "BMW");
car.color;
// undefined

car.name;
// "BMW"

例としては、carのみにアクセスすることができ、返されたオブジェクトの属性を

ケース2:いいえreturn、そのリターンundefined

function Car(color, name) {
    this.color = color;
}

var car = new Car("black", "BMW");
car.color;
// black

car.name;
// undefined

例としては、carのみにアクセスすることができ、コンストラクタのプロパティ、および逆の状況を。

ケース3:返すundefined以外の基本的なタイプを

function Car(color, name) {
    this.color = color;
    return "new car";
}

var car = new Car("black", "BMW");
car.color;
// black

car.name;
// undefined

例としては、carのみにアクセスすることができ、コンストラクタのプロパティ、および逆の状況を、結果はノーリターン値に相当します。

したがって、オブジェクトが返されたオブジェクトであるかどうかを決定するために、次の必要性によって返される値は、それ以外の場合は、新しく作成された戻り、オブジェクトではないobjオブジェクト。

おすすめ

転載: www.cnblogs.com/w-yh/p/12008171.html