简单原型
除了一个一个地添加原型属性,我们还可以通过对象字面量({}大括号)的形式进行创建
例如:
function CreatPerson () {};
// 第一种,一个一个创建
CreatPerson.prototype.name = 'zhang';
CreatPerson.prototype.age = 12;
// 第二种 对象字面量
CreatPerson.prototype = {
name:'zhang',
age:12
}
var person = new CreatPerson();
person.name||person.age
两种创建,结果是一样的。
不同之处在于:
第一种创建person.constructor指向构造函数
person.constructor == CreatPerson // true
第二种创建person.constructor将不会指向构造函数
person.constructor == CreatPerson // false
原因时创建对象字面量相当于重写了prototype对象,新对象的constructor指向Object构造函数
person.constructor == Object
相同之处:
通过instanceof依然可以得到相同结果
person instanceof CreatPerson // true 两种方法相同
解决方法:
// 第二种 对象字面量
CreatPerson.prototype = {
constructor:CreatPerson,
name:'zhang',
age:12
}
此时的constructor的[[Enumerable]](是否可以枚举,true),默认时false(不可).
可以通过设置Object.defineProperty()进行设置:
Object.defineProperty(CreatPerson.prototype,'constructor',{
enumeralbe:false,
value:CreatPerson
})
原型的动态性
function CreatPerson () {};
var person1 = new CreatPerson();
CreatPerson.prototype = { // 重写对象
constructor:CreatPerson,
name:'zhang',
age:12
}
var person2 = new CreatPerson();
console.log(person1.name) // undefined
console.log(person2.name) // zhang
实例person1实例和原型中没有属性name,此时perosn1的原型是没有重写之前的CreatPerson.prototype
实例person1中的原型是指重写的CreatPerson.prototype对象
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署