昨天有说明到函式与建构式的原型,及指定建构式函式原型为另一个建构式函式,但其实这会造成复写constructor的问题。

复写constructor的问题(vmwork)

我们昨天有提到「建构式函式可以透过.constructor来存取建立物件的函式以此来作类型检查。」,但是这个例子却会导致trickyMan的建构式的原型被复写,无法去判断。

function Person(){};

Person.prototype.say =“Hi”;

function trickyMan(){};

trickyMan.prototype = new Person();

var Jason = new trickyMan();

trickyMan.constructor === trickyMan;//false

所以如果在Jason物件上呼叫.constructor,会无法找到直到在Person上找到参照Person函式的constructor。

但是,这事实上是错误的,如果我问是哪个函式建立了Jason物件,会得到Person这可能会产生一些Bug。

幸好在JS中,物件的每个属性都有一个属性描述子(property desciptor),可以够过它设定以下键值:

configurable设定

true -表属性描述子可被修改及删除

false -上述两个动作都将被禁止

enumerable列举

true -属性能在物件的for-in循环操作中出现

value

设定属性的键值

writable写入

true -表可以透过设值叙述来修改属性值

get

定义取值(getter)函式,可用来取得属性值。无法与value及writable一起设定

set

定义设值(setter)函式,可以用来对属性指派一个值。无法与value及writable一起设定

先来个简单的例子:

Jason.age = 29;

age这个属性会是可设定、可列举并且可写入的,它的值被设为29,get和set函式则会是undefined。

如果要对上述设定值做更动的话,可以用Object.defineProperty:

var Jason = {};

Jason.say =“R~”;

Object.defineProperty(Jason,“age”,{

configurable:false,

enumerable:false,

value:29,

writable:true

});

console.log(“age”in Jason);

for(let key in Jason){

console.log(key);

}

好,现在我知道有这东西了,但这跟一开始说的constructor有关系吗?

当然有!我们试着用trickyMan扩展(extend)Person时(也可以说是让trickyMan成为Person的子类别),就失去原本保存在constructor属性上的trickyMan原型。

我们可以用Object.defineProperty在新的trickyMan.prototype上定义一个新的constructor属性。

function Person(){};

Person.prototype.say =“Hi”;

function trickyMan(){};

trickyMan.prototype = new Person();

Object.defineProperty(trickyMan,“constructor”,{

enumerable:false,

value:trickyMan,

writable:true

});

var Jason = new trickyMan();

trickyMan.constructor === trickyMan;//true

那么,今天就到这边,一样如果有错误及来源未附上也欢迎留言指正,那么我们明天见(leafor)。

学JS的心路历程-物件与原型(三)的更多相关文章

  1. 学JS的心路历程 -物件与原型(二)

    昨天有提到说Object.setPrototypeOf可以指定一个物件为另一个物件的原型,但有想过到底这个原型,也就是[[Prototype]]最终会到何处吗? 答案是Object.prototype ...

  2. 学JS的心路历程-物件与原型(一)

    前两天说明面向对象的三大特性及JS不符合面向对象,只能称作支持面向对象而已,今天我们来看看JS的原型继承. 首先我们先来看,什么是原型(vmwork): 两个物件之间的原型关系(prototype r ...

  3. 学JS的心路历程 -函式(三)this

    this是什么,取决于被呼叫的呼叫地点. 昨天有提到说,呼叫函式时候会传递隐含参数:arguments和this并讲解了arguments,今天我们就来探讨this吧! 什么是this 我们都会呼叫函 ...

  4. 学JS的心路历程 - PixiJS -基础(三)

    今天我们来试着移动图片吧! 首先,一样先把图片放到PIXI的stage中: let app = new PIXI.Application({ width: 800, height: 600, back ...

  5. 学JS的心路历程 - JS的Class

    没错,你没有看错,虽然前面说JS是原型继承,但在ES6以后新增了class关键字!!! 不过底层实作仍然是以原型继承方式进行,所以基本上算是一个语法糖. 今天我们就来看一下如何使用吧! class 首 ...

  6. 学JS的心路历程-JS支持面向对象?(二)

    昨天讲了面向对象的继承,今天我们来谈谈多态和封装吧! 多态polymorphism 抽象讲法解释,就是使用单一界面操作多种型态的物件 继承父类别,定义与父类别中相同的方法,但实作内容不同,称为复写(o ...

  7. 学JS的心路历程-JS支持面向对象?(一)

    昨天在看Prototype看到JS支持面向对象,被前辈问到说那什么是面向对象?JS是面向对象语言吗? 便开始了一连串艰辛爬文过程,今天就来看一下两者有什么差异吧(rgwyjc)! 首先面向对象有三大特 ...

  8. 学JS的心路历程-for of和for in

    我们在刚入门JS时候,说到要跑出数组的每个值肯定都是这样子: var arr = [1,2,3,4,5,6]: for(let i = 0:i < arr.length:i++){ consol ...

  9. 学JS的心路历程Day26 - PixiJS -入坑

    后来知道也可以透过canvas让网页动起来! 而PixiJS是使用WebGL在canvas上绘制内容与制作动态 且同时有下列特色: 支持多点触控 掩码与混合模式 可外加WebGL滤镜 多装置支持 等等 ...

随机推荐

  1. Java7 新特性: try-with-resources

    Try-with-resources是java7中一个新的异常处理机制,它能够很容易地关闭在try-catch语句块中使用的资源. 利用Try-Catch-Finally管理资源(旧的代码风格)在ja ...

  2. flask session,蓝图,装饰器,路由和对象配置

    1.Flask 中的路由   *endpoint - url_for 反向地址  *endpoint 默认是视图函数名  *methods 指定视图函数的请求方式,默认GET  defaults={& ...

  3. Jquery在表格中搜索关键字

    <!DOCTYPE html><html><head> <title>ddd</title></head><body> ...

  4. 如何将相册中的动态GIF图转化成NSData类型

    http://www.cocoachina.com/bbs/read.php?tid=151776

  5. 《算法》第四章部分程序 part 12

    ▶ 书中第四章部分程序,包括在加上自己补充的代码,图的几种补充数据结构,包括无向 / 有向符号图,有权边结构,有边权有向图 ● 无向符号图 package package01; import edu. ...

  6. Yii框架中使用SRBAC作为权限管理模块时遇到的问题

    Yii框架中使用SRBAC作为权限管理模块时遇到的问题   看到Yii中提供RBAC的插件,SRBAC,就想用用. 结果按照手册上的安装办法,整来整去,安装完了,可就是进不了权限管理界面. 最后想到, ...

  7. VUE 前端项目优化方法

    前端项目通过webpack打包会生成app.js和vendor.js,如果第三方组件依赖过多,会造成打包后的vendor.js过大,页面首次加载的时候会出现白屏时间过长,影响用户体验.对此,我们需要通 ...

  8. day08-字符串操作

    name = 'hello,world,WORLD! 123,你好' #capitalize()#首字母大写,其他全部变成小写,没有iscapitalize()方法print(name.capital ...

  9. MySQL创建只读账号

    应用场景:只要公司有数据团队的,那免不了让这帮家伙把全公司的数据库数据都摸一遍,但是要是直接把root用户给了他们,未免有点危险,于是只能给这帮人设权限,一般而言,他们只是做读操作,既然做读操作,那么 ...

  10. git学习入门

    git: 安装 git是目前最流行的版本管理系统,分为github(公共开源,代码可随意下载)和gitlib(私有化,企业使用).