创建没有原型对象的方式

文章类型:Javascript

发布者:admin

发布时间:2023-05-11

在某些特定的场景,我们只想简单使用对象类型,不需要原型属性和方法,就需要创建没有原型的对象,有利于提高性能和优化

一:采用Object.create(null),没有任何的原型链,因此没有继承任何属性和方法,由于没有原型,不能使用 instanceof 运算符来检查它的类型。可以使用 Object.getPrototypeOf(obj) === null 来进行判断

var obj = Object.create(null);
console.log(obj); // {}

// 尝试访问 obj 的 toString 方法
console.log(obj.toString()); // TypeError: obj.toString is not a function

// 尝试使用 hasOwnProperty 方法检查 obj 是否包含某个属性
console.log(obj.hasOwnProperty("foo")); // TypeError: obj.hasOwnProperty is not a function

二:采用字面量方式,设置原型为空方式

var obj = {};
Object.setPrototypeOf(obj, null);
console.log(obj); // {}

// 尝试访问 obj 的 toString 方法
console.log(obj.toString()); // TypeError: obj.toString is not a function

// 尝试使用 hasOwnProperty 方法检查 obj 是否包含某个属性
console.log(obj.hasOwnProperty("foo")); // TypeError: obj.hasOwnProperty is not a function

三:采用字面量加__proto__设置为null方式

var obj = {};
obj.__proto__ = null;
console.log(obj); // {}

// 尝试访问 obj 的 toString 方法
console.log(obj.toString()); // TypeError: obj.toString is not a function

// 尝试使用 hasOwnProperty 方法检查 obj 是否包含某个属性
console.log(obj.hasOwnProperty("foo")); // TypeError: obj.hasOwnProperty is not a function

四:采用空构造函数设置原型为null方式

function MyObject() {}
MyObject.prototype = null;

var obj = new MyObject();
console.log(obj); // {}

// 尝试访问 obj 的 toString 方法
console.log(obj.toString()); // TypeError: obj.toString is not a function

// 尝试使用 hasOwnProperty 方法检查 obj 是否包含某个属性
console.log(obj.hasOwnProperty("foo")); // TypeError: obj.hasOwnProperty is not a function