为什么`.constructor`在这种情况下指向`object`?

时间:2017-06-01 01:22:45

标签: javascript constructor prototype

在下面的例子中:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if indexPath.row + 1 == yourArray.count {
        print("do something")
    }
}

现在var A = function() {}; var a = new A(); var b = new A(); A.prototype.member1 = 10; A.prototype = {} var c = new A(); a.constructor都指向b.constructor,这是预期的。 但是,function A指向空格c.constructor

这背后的理由是什么?感谢。

1 个答案:

答案 0 :(得分:1)

  

现在a.constructor和b.constructor都指向函数   A,这是预期的。但是,c.constructor指向一个空白   宾语。    a b 都将原始 A.prototype 对象作为其内部[[Prototype]],其具有引用的构造函数属性A 的。所以当你这样做时:

     

这背后的理由是什么?感谢。

a.constructor

它是继承的构造函数属性。

然后用一个没有构造函数属性的新“空”对象替换原始原型对象。替换构造函数的原型不会更改现有实例的内部[[Prototype]],它们仍然引用构造它们时原型的对象。

新对象将仅用作新实例的[[Prototype]],因此当您构造 c 时,它的内部[[Prototype]]就是这个没有构造函数属性,因此它沿[[Prototype]]链继续,直到在 Object.prototoype 上找到构造函数属性,该属性引用对象构造函数。

var A = function() {};
var a = new A();
var b = new A();

A.prototype.member1 = 10;

// Replace A.prototype
A.prototype = {}
var c = new A();

// a still uses original prototype, so inherits member1
console.log(a.member1); // 10

// c uses the plain object, so doesn't have member1 property
console.log(c.member1); // undefined

// c inherits constructor property from Object.prototype, so
// references Object constructor
console.log(c.constructor === Object); // true