JavaScript 建立对象方法 Object.create()、new Object()、{} 比较
1 Object.create()
Object.create(null) 创建的对象是一个空对象,在该对象上没有继承 Object.prototype 原型链上的属性或者方法,例如:toString()、hasOwnProperty() 等方法
Object.create() 方法接受两个参数: Object.create(obj, propertiesObject)
obj: 一个对象,新创建的对象的原型。
propertiesObject:可选。该参数对象是一组属性与值,该对象的属性名称将是新创建的对象的属性名称,值是属性描述符(这些属性描述符的结构与Object.defineProperties()的第二个参数一样)。
注意:propertiesObject 参数对象不能是 undefined,另外只有该对象中自身拥有的可枚举的属性才有效,即 该对象的原型链上属性是无效的。
var obj = Object.create(Object.prototype, {
// foo会成为所创建对象的数据属性
foo: {
configurable: true, //能否使用delete、能否需改属性特性、或能否修改访问器属性,默认为false不可重新定义
enumerable:false, //对象属性是否可通过for-in循环,默认值为flase不可循环
writable: true, //对象属性是否可修改,默认值为flase不可修改
value: "hello" //对象属性的默认值,默认值为undefined
},
// bar会成为所创建对象的访问器属性
bar: {
configurable: false,
get: function () { return 10 },
set: function (value) {
console.log("Setting `o.bar` to", value);
}
}
});
console.log(obj.foo); // hello
console.log(obj.foo = '你好!') // 你好!
var other = Object.create(null);
console.log(other); // {} No Properties
2 new Object() 和 {}
new Object() 和 {} 的本质并无区别,默认都是继承了Object对象上的prototype
var test0 = {}
var test1 = { x: 1 }
var test2 = new Object()
var test3 = new Object(test1) // 继承test1
var test4 = Object.create(test1)
var test5 = function () { } // 构造函数
test5.prototype = test1 // 继承test1
var test6 = new test5()
console.log(`test0:`, test0) // test0: {} __proto__.constructor: Object()
console.log(`test1:`, test1) // test1: { x: 1} __proto__.constructor: Object()
console.log(`test2:`, test2) // test2: {} __proto__.constructor: Object()
console.log(`test3:`, test3) // test3: {x:1} __proto__.constructor: Object()
console.log(`test4:`, test4) // test4: {} __proto__ 为test1
console.log(`test5:`, test5) // test5: f(){}
console.log(`test6:`, test6) // test6: test5 {}
console.log(test0.__proto__ === test2.__proto__) // true
console.log(test1.__proto__ === test3.__proto__) // true
console.log(test3.__proto__ === test4.__proto__) // false
console.log(test6.__proto__ === test1) // true
console.log(test6.__proto__ === test3.__proto__) // false
console.log(test6.__proto__ === test4.__proto__) // true
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)