我们先来一个简单的构造函数+原型对象的小程序
function CreateObj( uName, uAge ) { this.userName = uName; this.userAge = uAge; } CreateObj.prototype.showUserName = function () { return this.userName; } CreateObj.prototype.showUserAge = function () { return this.userAge; }
这个程序,没有什么问题,但是非常的冗余,每次扩展一个方法,都要写一次原型对象,我们可以把原型对象prototype当做一个字面量对象,所有的方法都在字面量对象中扩展,可以达到同样的效果:
CreateObj.prototype = { showUserAge : function(){ return this.userAge; }, showUserName : function(){ return this.userName; }, } var obj1 = new CreateObj( 'ghostwu', 22 ); var obj2 = new CreateObj( '卫庄', 24 ); console.log( obj1.showUserName(), obj1.showUserAge() ); //ghostwu 22 console.log( obj2.showUserName(), obj2.showUserAge() ); //卫庄 24
但是这种原型(prototype)对象的写法,属于重写了CreateObj的默认原型对象,造成的第一个问题就是constructor不再指向CreateObj.
没有重写之前,constructor指向CreateObj
function CreateObj( uName, uAge ) { this.userName = uName; this.userAge = uAge; } CreateObj.prototype.showUserName = function () { return this.userName; } CreateObj.prototype.showUserAge = function () { return this.userAge; } console.log( CreateObj.prototype.constructor === CreateObj ); //true
重写之后,constructor指向Object
CreateObj.prototype = { showUserAge : function(){ return this.userAge; }, showUserName : function(){ return this.userName; }, } console.log( CreateObj.prototype.constructor === CreateObj ); //false console.log( CreateObj.prototype.constructor === Object ); //true
所以说,constructor不能准确的标识对象,因为他会被修改
我们之前写的程序,基本都是在原型对象(prototype)上扩展完了方法之后,再实例化对象,我们看下,先实例化对象,再在原型对象(prototype)上扩展函数,
实例对象是否能正常的调用到扩展的方法?
function CreateObj( uName, uAge ) { this.userName = uName; this.userAge = uAge; } var obj1 = new CreateObj( 'ghostwu', 22 ); CreateObj.prototype.showUserName = function(){ return this.userName; } console.log( obj1.showUserName() ); //ghostwu
可以正常调用,但是,如果原型对象是重写的,就调用不到了
function CreateObj( uName, uAge ) { this.userName = uName; this.userAge = uAge; } var obj1 = new CreateObj( 'ghostwu', 22 ); CreateObj.prototype = { showUserName : function(){ return this.userName; } } console.log( obj1.showUserName() ); //报错
因为重写了原型对象之后,同时实例化又是在重写之前发生的,所以实例的隐式原型__proto__不会指向重写的原型对象,所以就调用不到另一个问题,如果在原型对象(prototype)上有引用类型,千万小心,因为多个实例共用原型对象,只要有一个实例改变了引用类型的值,其他实例全部会收到改变之后的结果。
function CreateObj(){} CreateObj.prototype = { name : 'ghostwu', skills : [ 'php', 'javascript', 'linux' ] }; var obj1 = new CreateObj(); obj1.skills.push( 'python' ); var obj2 = new CreateObj(); console.log( obj2.skills ); //'php', 'javascript', 'linux', 'python'
原型对象(prototype)的共享特性,可以很方便的为一些内置的对象扩展一些方法,比如,数组去重复
Array.prototype.unique = function(){ var res = []; for( var i = 0, len = this.length; i < len; i++ ){ if( res.indexOf( this[i] ) == -1 ) { res.push( this[i] ); } } return res; } var arr = [ 10, 20, 30, 20, 30, 20, 40, 20 ]; console.log( arr.unique() ); //10, 20, 30, 40
但是,不要随便往内置的对象上面扩展方法,在多人协作开发,很容易产生覆盖,以及污染。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]