**Object.prototype**
属性表示 Object
的原型对象。
1、属性特性
Object.prototype 属性的属性特性: | 类型 | 值 |
---|---|---|
writable | boolean | true |
enumerable | boolean | false |
configurable | boolean | true |
2、描述
几乎所有的 JavaScript 对象都是 Object
的实例;一个典型的对象继承了Object.prototype
的属性(包括方法),尽管这些属性可能被遮蔽(亦称为覆盖)。但是有时候可能故意创建不具有典型原型链继承的对象,比如通过Object.create(null)
方法创建的对象,或者通过Object.setPrototypeOf
方法改变原型链。
改变Object
原型,会通过原型链改变所有对象;除非在原型链中进一步覆盖受这些变化影响的属性和方法。这提供了一个非常强大的、但有潜在危险的机制来覆盖或扩展对象行为。
3、属性
3.1 Object.prototype.constructor
返回创建实例对象的 Object
构造函数的引用。注意,此属性的值是对函数本身的引用,而不是一个包含函数名称的字符串。对原始类型来说,如1
,true
和"test"
,该值只可读。
var o = {};
console.log(o.constructor === Object); // true
var o = new Object();
console.log(o.constructor === Object); // true
var a = [];
console.log(a.constructor === Array); // true
var a = new Array();
console.log(a.constructor === Array); // true
var n = new Number(3);
console.log(n.constructor === Number); // true
上面实例中,所有对象都会从它的原型上继承一个 constructor 属性。
我们也可以改变对象的constructor属性,但是并不安全。
比如我们给子类添加链式调用的功能,constructor属性指向不对,将报错。
举个🌰~~
function Parent() {}
function CreatedConstructor() {}
CreatedConstructor.prototype = Object.create(Parent.prototype);
// CreatedConstructor.prototype.constructor = CreatedConstructor; // (第四行)set right constructor for further using
CreatedConstructor.prototype.create = function() {
return new this.constructor();
};
console.log(CreatedConstructor.prototype.constructor); //ƒ Parent() {}
new CreatedConstructor().create().create();
上述例子,我们修改了CreatedConstructor的prototype指向,在CreatedConstructor的prototype上创建create方法 。create方法返回当前实例的构造函数,实现链式调用。注释掉第四行,发现报错,只能调用一次create方法。

放开第四行,设置正确的constructor指向,就可以实现了。

总结
手动设置或更新构造函数可能会导致不同且有时令人困惑的后果。为了防止它,只需在每个特定情况下定义构造函数的角色。在大多数情况下,不使用构造函数,并且不需要重新分配构造函数。
网友评论