JavaScript高级程序设计之面向对象的程序设计之继承之原型式继承第6.3.4讲笔记
来源:互联网 发布:linux动态打印日志 编辑:程序博客网 时间:2024/05/01 18:57
道格拉斯·克罗克福德在2006 年写了一篇文章,题为Prototypal Inheritance in JavaScript (JavaScript
中的原型式继承)。在这篇文章中,他介绍了一种实现继承的方法,这种方法并没有使用严格意义上的
构造函数。他的想法是借助原型可以基于已有的对象创建新对象,同时还不必因此创建自定义类型。为
了达到这个目的,他给出了如下函数。
在 object()函数内部,先创建了一个临时性的构造函数,然后将传入的对象作为这个构造函数的
克罗克福德主张的这种原型式继承,要求你必须有一个对象可以作为另一个对象的基础。如果有这么
一个对象的话,可以把它传递给object()函数,然后再根据具体需求对得到的对象加以修改即可。在这
个例子中,可以作为另一个对象基础的是person 对象,于是我们把它传入到object()函数中,然后该
函数就会返回一个新对象。这个新对象将person 作为原型,所以它的原型中就包含一个基本类型值属性
和一个引用类型值属性。这意味着person.friends 不仅属于person 所有,而且也会被anotherPerson
以及yetAnotherPerson 共享。实际上,这就相当于又创建了person 对象的两个副本。
ECMAScript 5 通过新增Object.create()方法规范化了原型式继承。这个方法接收两个参数:一
个用作新对象原型的对象和(可选的)一个为新对象定义额外属性的对象。在传入一个参数的情况下,
Object.create()与object()方法的行为相同。
Object.create()方法的第二个参数与Object.defineProperties()方法的第二个参数格式相
同:每个属性都是通过自己的描述符定义的。以这种方式指定的任何属性都会覆盖原型对象上的同名属
性。例如:
支持Object.create()方法的浏览器有IE9+、Firefox 4+、Safari 5+、Opera 12+和Chrome。
在没有必要兴师动众地创建构造函数,而只想让一个对象与另一个对象保持类似的情况下,原型式
继承是完全可以胜任的。不过别忘了,包含引用类型值的属性始终都会共享相应的值,就像使用原型模
式一样。
中的原型式继承)。在这篇文章中,他介绍了一种实现继承的方法,这种方法并没有使用严格意义上的
构造函数。他的想法是借助原型可以基于已有的对象创建新对象,同时还不必因此创建自定义类型。为
了达到这个目的,他给出了如下函数。
function object(o){function F(){}F.prototype = o;return new F();}
在 object()函数内部,先创建了一个临时性的构造函数,然后将传入的对象作为这个构造函数的
原型,最后返回了这个临时类型的一个新实例。从本质上讲,object()对传入其中的对象执行了一次
浅复制。来看下面的例子。
var person = {name: "Nicholas",friends: ["Shelby", "Court", "Van"]};var anotherPerson = object(person);anotherPerson.name = "Greg";anotherPerson.friends.push("Rob");var yetAnotherPerson = object(person);yetAnotherPerson.name = "Linda";yetAnotherPerson.friends.push("Barbie");alert(person.friends); //"Shelby,Court,Van,Rob,Barbie"
克罗克福德主张的这种原型式继承,要求你必须有一个对象可以作为另一个对象的基础。如果有这么
一个对象的话,可以把它传递给object()函数,然后再根据具体需求对得到的对象加以修改即可。在这
个例子中,可以作为另一个对象基础的是person 对象,于是我们把它传入到object()函数中,然后该
函数就会返回一个新对象。这个新对象将person 作为原型,所以它的原型中就包含一个基本类型值属性
和一个引用类型值属性。这意味着person.friends 不仅属于person 所有,而且也会被anotherPerson
以及yetAnotherPerson 共享。实际上,这就相当于又创建了person 对象的两个副本。
ECMAScript 5 通过新增Object.create()方法规范化了原型式继承。这个方法接收两个参数:一
个用作新对象原型的对象和(可选的)一个为新对象定义额外属性的对象。在传入一个参数的情况下,
Object.create()与object()方法的行为相同。
var person = {name: "Nicholas",friends: ["Shelby", "Court", "Van"]};var anotherPerson = Object.create(person);anotherPerson.name = "Greg";anotherPerson.friends.push("Rob");var yetAnotherPerson = Object.create(person);yetAnotherPerson.name = "Linda";yetAnotherPerson.friends.push("Barbie");alert(person.friends); //"Shelby,Court,Van,Rob,Barbie"
Object.create()方法的第二个参数与Object.defineProperties()方法的第二个参数格式相
同:每个属性都是通过自己的描述符定义的。以这种方式指定的任何属性都会覆盖原型对象上的同名属
性。例如:
var person = {name: "Nicholas",friends: ["Shelby", "Court", "Van"]};var anotherPerson = Object.create(person, {name: {value: "Greg"}});alert(anotherPerson.name); //"Greg"
支持Object.create()方法的浏览器有IE9+、Firefox 4+、Safari 5+、Opera 12+和Chrome。
在没有必要兴师动众地创建构造函数,而只想让一个对象与另一个对象保持类似的情况下,原型式
继承是完全可以胜任的。不过别忘了,包含引用类型值的属性始终都会共享相应的值,就像使用原型模
式一样。
0 0
- JavaScript高级程序设计之面向对象的程序设计之继承之原型式继承第6.3.4讲笔记
- JavaScript高级程序设计之面向对象的程序设计之继承之组合继承第6.3.3讲笔记
- JavaScript高级程序设计之面向对象的程序设计之继承之寄生式继承第6.3.5讲笔记
- JavaScript高级程序设计之面向对象的程序设计之继承之寄生组合式继承第6.3.6讲笔记
- JavaScript高级程序设计之面向对象的程序设计之继承之原型链 第6.3.1讲笔记
- JavaScript高级程序设计之面向对象的程序设计之继承之借用构造函数第6.3.2讲笔记
- JavaScript高级程序设计之面向对象的程序设计之理解对象第6.1讲笔记
- JavaScript高级程序设计之面向对象的程序设计之创建对象之工厂模式第6.2.1讲笔记
- JavaScript高级程序设计之面向对象的程序设计之创建对象之 构造函数模式第6.2.2讲笔记
- JavaScript高级程序设计之面向对象的程序设计之创建对象之原型模式 第6.2.3讲笔记
- JavaScript高级程序设计之面向对象的程序设计之创建对象之动态原型模式 第6.2.5讲笔记
- 【JavaScript学习】面向对象的程序设计(6):原型式继承
- JavaScript高级程序设计之面向对象的程序设计之创建对象之组合使用构造函数模式和原型模式 第6.2.4讲笔记
- javascript 的 继承(四) 之 原型式继承
- JavaScript高级程序设计之面向对象的程序设计之创建对象之寄生构造函数模式 第6.2.6讲笔记
- JavaScript高级程序设计之面向对象的程序设计之创建对象之稳妥构造函数模式 第6.2.7讲笔记
- JavaScript高级程序设计之BOM之window 对象之窗口大小 第8.1.4讲笔记
- JavaScript高级程序设计笔记之面向对象
- 强大的properties文件读写操作
- 解决ubuntu 12.04 中gedit中文乱码
- Android UI开发
- centos 6.5 install redis
- ORACLE数据泵
- JavaScript高级程序设计之面向对象的程序设计之继承之原型式继承第6.3.4讲笔记
- 阿里电视游戏开发者沙龙召开 把脉电视游戏新方向
- Java对象的序列化与反序列化
- Js 实现图片放大功能
- Mysql使用技巧
- 反射
- 其他测试脚本
- Android之GPS定位详解
- linux常用命令(54):kill命令