资讯专栏INFORMATION COLUMN

使用对象字面量重写prototype需要注意的问题

simon_chen / 3170人阅读

摘要:前言为了方便,大部分人都是直接使用字面量来初始化对象,我们知道原型对象是创建函数自带的,如果使用字面量来初始化相当于重写原型对象,这样就会导致一些如下问题。

前言

为了方便,大部分人都是直接使用字面量来初始化对象,我们知道原型对象是创建函数自带的,如果使用字面量来初始化相当于重写原型对象,这样就会导致一些如下问题。

正文

问题:
重写之后,原型对象的constructor不在指向原型对象所在的函数

function demo1 () {
}
demo1.prototype = {
    show: function() {console.log("execute success!")}
}
demo1.prototype.constructor不再指向demo1

既然有了问题,那自然有解决问题的方法

方法就是让构造函数重新指向原先得对象
function demo1 () {}
demo1.prototype = {
    constructor: demo1,
    show: function() {console.log("execute success!")}
}

但是这样写又有了新问题,[[Enumerable]]默认是true,而原先的构造函数默认是false,这时候我们可以修改对象的属性,修改对象的属性自然要用到强大的defineProperty啦

function demo1 () {}
demo1.prototype = {
    show: function() {console.log("execute success!")}
}
Object.defineProperty(demo1.prototype, "constructor", {
    enumerable: false,
    value: demo1
})

好啦,大功告成,就是这样啦

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/96594.html

相关文章

  • [js高手之路]使用原型对象(prototype)需要注意地方

    摘要:原型对象的共享特性,可以很方便的为一些内置的对象扩展一些方法,比如,数组去重复但是,不要随便往内置的对象上面扩展方法,在多人协作开发,很容易产生覆盖,以及污染 我们先来一个简单的构造函数+原型对象的小程序 1 function CreateObj( uName, uAge ) { 2 this.userName = uName; 3 ...

    chnmagnus 评论0 收藏0
  • JavaScript面向对象程序设计——“创建对象注意要点

    摘要:所以,可以创建自定义的构造函数,从而定义自定义对象类型的属性和方法。如对于构造函数原型属性以及实例之间的关系,参见高级程序设计一书中第章节。稳妥构造函数模式稳妥对象,指的是没有公共属性,且其方法也不引用的对象如 创建对象 Object 构造函数或对象字面量都可以用来创建单个对象。但这个方法的缺点非常明显:同一个接口创建很可耐多对象会产生大量的重复代码。为了解决这个问题,人们开始使用工厂...

    tracymac7 评论0 收藏0
  • 浅谈 OOP JavaScript [3] -- 原型

    摘要:上一章我们谈了构造函数,他的唯一特点就是比较了地址不相同,因为大家知道引用类型是比较的引用。也就是说不用在构造函数中定义对象实例,而是直接将这些添加到原型当中。如果构造函数实例里面没有,就去原型里面查找,如果有就立即返回。 上一章我们谈了构造函数,他的唯一特点就是比较了地址不相同,因为大家知道引用类型是比较的引用。我们来谈谈原型。 原型 我们每创建一个函数都有一个原型(prototyp...

    SQC 评论0 收藏0
  • JavaScript面向对象精要(二)

    摘要:使用时,会自动创建对象,其类型为构造函数类型,指向对象实例缺少关键字,指向全局对象。构造函数本身也具有属性指向原型对象。 在JavaScript面向对象精要(一)中讲解了一些与面向对象相关的概念和方法,这篇讲讲原型和继承。 构造函数和原型对象 构造函数也是函数,用new创建对象时调用的函数,与普通函数的一个区别是,其首字母应该大写。但如果将构造函数当作普通函数调用(缺少new关键字...

    wayneli 评论0 收藏0
  • Javascript对象创建方法

    摘要:构造函数与原型组合利用构造函数都是实例属性和原型的共享特性,分别定义对应的内容,组合共同完成对象创建,而且该模式还支持想构造函数传递参数。引用类型为实例属性寄生构造模式构造函数在不反回值的情况下,默认会返回新对象实例。 创建对象 1.1 通过Object对象创建 var person = new Object(); person.name = Albert; person.sayNam...

    ZoomQuiet 评论0 收藏0

发表评论

0条评论

simon_chen

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<