摘要:前言为了方便,大部分人都是直接使用字面量来初始化对象,我们知道原型对象是创建函数自带的,如果使用字面量来初始化相当于重写原型对象,这样就会导致一些如下问题。
前言
为了方便,大部分人都是直接使用字面量来初始化对象,我们知道原型对象是创建函数自带的,如果使用字面量来初始化相当于重写原型对象,这样就会导致一些如下问题。
正文问题:
重写之后,原型对象的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
摘要:原型对象的共享特性,可以很方便的为一些内置的对象扩展一些方法,比如,数组去重复但是,不要随便往内置的对象上面扩展方法,在多人协作开发,很容易产生覆盖,以及污染 我们先来一个简单的构造函数+原型对象的小程序 1 function CreateObj( uName, uAge ) { 2 this.userName = uName; 3 ...
摘要:所以,可以创建自定义的构造函数,从而定义自定义对象类型的属性和方法。如对于构造函数原型属性以及实例之间的关系,参见高级程序设计一书中第章节。稳妥构造函数模式稳妥对象,指的是没有公共属性,且其方法也不引用的对象如 创建对象 Object 构造函数或对象字面量都可以用来创建单个对象。但这个方法的缺点非常明显:同一个接口创建很可耐多对象会产生大量的重复代码。为了解决这个问题,人们开始使用工厂...
摘要:上一章我们谈了构造函数,他的唯一特点就是比较了地址不相同,因为大家知道引用类型是比较的引用。也就是说不用在构造函数中定义对象实例,而是直接将这些添加到原型当中。如果构造函数实例里面没有,就去原型里面查找,如果有就立即返回。 上一章我们谈了构造函数,他的唯一特点就是比较了地址不相同,因为大家知道引用类型是比较的引用。我们来谈谈原型。 原型 我们每创建一个函数都有一个原型(prototyp...
摘要:使用时,会自动创建对象,其类型为构造函数类型,指向对象实例缺少关键字,指向全局对象。构造函数本身也具有属性指向原型对象。 在JavaScript面向对象精要(一)中讲解了一些与面向对象相关的概念和方法,这篇讲讲原型和继承。 构造函数和原型对象 构造函数也是函数,用new创建对象时调用的函数,与普通函数的一个区别是,其首字母应该大写。但如果将构造函数当作普通函数调用(缺少new关键字...
摘要:构造函数与原型组合利用构造函数都是实例属性和原型的共享特性,分别定义对应的内容,组合共同完成对象创建,而且该模式还支持想构造函数传递参数。引用类型为实例属性寄生构造模式构造函数在不反回值的情况下,默认会返回新对象实例。 创建对象 1.1 通过Object对象创建 var person = new Object(); person.name = Albert; person.sayNam...
阅读 3434·2021-09-08 09:36
阅读 2477·2019-08-30 15:54
阅读 2301·2019-08-30 15:54
阅读 1745·2019-08-30 15:44
阅读 2359·2019-08-26 14:04
阅读 2394·2019-08-26 14:01
阅读 2825·2019-08-26 13:58
阅读 1252·2019-08-26 13:47