一、知识储备:
1.枚举属性名的函数:
(1)对于.in:可以遍历循环体中对象的所有可枚举属性(包括自身属性和继承属性)。
(2)Object.keys():返回一个数组(可枚举自身属性)。
(3)object . getowntpropertynames():都有自己的属性。
3.属性:数据属性和访问器属性。
(1)数据属性:可写、可枚举、可配置的值。
数据属性只有一个简单值;
(2)访问器属性:是设置的、读取的、可枚举的和可配置的。
访问器属性不可写(即没有可写属性)。
如果一个属性有set方法,它是可写的,如果它有get方法,它是可读的。
4.定义属性特征的方法:对象.定义属性(对象,属性,描述符对象)。
5.获取属性的描述符对象:object . getowntpropertysdescriptor(对象,属性)。
第二,例子。
1.根据的用法.在中,我们可以编写模拟“继承”的方法:
脚本类型=' text/JavaScript ' var child={ };Varmother={name: '张志英',lastage :21,sex: '女性' };函数extend(target,source){ for(var p in source){ target[p]=source[p];}返回目标;} extend(孩子、母亲);console.log(子级);//strongobject {name: '张志英',lastage : 21,sex: '女性' }/STRONG /script 2,用于in循环遍历原型对象的属性,然后将它们逐一分配给我们的空对象,从而实现“继承”。这个想法是正确的。下面我们来改革一下上面的例子:
脚本类型=' text/JavaScript ' var child={ };var母亲={ name: '张志英',lastAge:21,STRONGset设置年龄(值){ this.lastAge=value},get age(){ return this . lastage 1;},/STRONG sex: '女' };BRSTRONG母亲.年龄=15岁;/STRONG //有一个set方法,是可写的。函数extend (target,source){ for(var p in source){ target[p]=source[p];}返回目标;} extend(孩子、母亲);console.log(子级);//strongobject {name: '张志英',lastage : 15,age: 16,sex: '女' }/STRONG /script显示一对set and get在代码中使用;其中年龄是访问器属性。
运行结果:一个没有设置和获取的普通对象。
结论:实现中for的“继承”不处理set和get,它将访问器属性(age)转换为静态数据属性。
3.为母对象设置数据属性。
脚本类型=' text/JavaScript ' var child={ };var母亲={ name: '张志英',lastAge:21,设置年龄(值){ this.lastAge=value},get age(){ return this . lastage 1;},sex: '女' };Object.defineProperty(母亲,‘lastAge’,{ writable : false });//将lastAge设置为不成文的母亲.=15//设置无效,因为lastAge的值不变,所以lastAge 1不变,即年龄不变。函数extend (target,source){ for(var p in source){ target[p]=source[p];}返回目标;} extend(孩子、母亲);console.log(子级);//对象{姓名: '张志英',姓氏: 21,年龄: 22,性别: '女性' }孩子.姓氏=12;//结果显示lastAge发生了变化,说明child.lastAge不具备从母亲. lastAge“继承”的特性,我们将确认BRConsole.log(对象。getOEM ID=_ _ mcedel/script/em)与getOwnPropertyDesriptor()方法。结论:要实现继承,还需要解决“继承”属性的问题。
4.完美的版本。
脚本类型=' text/JavaScript ' var child={ };定义变量母亲={ name: '张志英,lastAge:21,设置年龄(值){ this.lastAge=value},get age(){ return this。last age 1;},sex: '女' };object . defineperproperty(母亲,' lastAge ',{可写: false });母亲年龄=15岁;SPAN style=' color : # 333399 '强功能扩展(目标,源){ var names=object。getowntpropertynames(源);//获取所有的属性名for(var I=0;长度;I){ 0如果(目标中的[i]名称)继续;//如果这个属性存在,就跳过(原型继承中,如果自有属性和原型对象的属性重名,保留自有属性)var desc=object。getowntpropertysdescriptor(来源,名称[I]);//获取母亲属性的描述符对象(即属性特性的集合,es5中用描述符对象来表示)对象。定义属性(目标,名称[i],desc);//将母亲的描述符对象给儿童的属性定义}返回目标;}/STRONG/SPAN扩展(孩子、母亲);console.log(子级);child.lastAge=12console。日志(对象。getowntpropertysdescriptor(子级,‘lastAge’);console.log(子级);/script最后的结果:
可以明显看到三次的打印,孩子"继承"到了设置和get,lastAge数值没发生变化,可写也是错误的了。
总结:最近在看《javascript权威指南》 ,总结一点心得,有错误欢迎指正,共同学习进步~
以上这篇爪哇岛描述语言用函数实现继承详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。