firefox-Developer开发者站点——关于Object.create()新方法的介绍
2015-12-11 11:12
686 查看
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/create
如果你希望能继承到多个对象,则可以使用混入的方式。
mixin函数会把超类原型上的函数拷贝到子类原型上,这里mixin函数没有给出,需要由你实现。一个和 mixin 很像的函数是 jQuery.extend。
Mobile
John Resig's post on getPrototypeOf
Object.create()方法创建一个拥有指定原型和若干个指定属性的对象。
语法
Object.create(proto, [ propertiesObject ])
参数
proto一个对象,作为新创建对象的原型。propertiesObject可选。该参数对象是一组属性与值,该对象的属性名称将是新创建的对象的属性名称,值是属性描述符(这些属性描述符的结构与Object.defineProperties()的第二个参数一样)。注意:该参数对象不能是
undefined,另外只有该对象中自身拥有的可枚举的属性才有效,也就是说该对象的原型链上属性是无效的。
抛出异常
如果 proto 参数不是null或一个对象值,则抛出一个
TypeError异常。
例子
使用Object.create实现类式继承
下面的例子演示了如何使用Object.create()来实现类式继承。这是一个单继承。//Shape - superclass function Shape() { this.x = 0]this.y = 0; } Shape.prototype.move = function(x, y) { this.x += x; this.y += y; console.info("Shape moved."); }; // Rectangle - subclass function Rectangle() { Shape.call(this); //call super constructor. } Rectangle.prototype = Object.create(Shape.prototype); var rect = new Rectangle(); rect instanceof Rectangle //true. rect instanceof Shape //true. rect.move(1, 1); //Outputs, "Shape moved."
如果你希望能继承到多个对象,则可以使用混入的方式。
function MyClass() { SuperClass.call(this)].call(this); } MyClass.prototype = Object.create(SuperClass.prototype); //inherit mixin(MyClass.prototype, OtherSuperClass.prototype); //mixin MyClass.prototype.myMethod = function() { // do a thing };
mixin函数会把超类原型上的函数拷贝到子类原型上,这里mixin函数没有给出,需要由你实现。一个和 mixin 很像的函数是 jQuery.extend。
使用Object.create 的 propertyObject 参数
var o]// 创建一个原型为null的空对象 o = Object.create(null); o = {}; // 以字面量方式创建的空对象就相当于: o = Object.create(Object.prototype); o = Object.create(Object.prototype, { // foo会成为所创建对象的数据属性 foo: { writable:true, configurable:true, value: "hello" }, // bar会成为所创建对象的访问器属性 bar: { configurable: false, get: function() { return 10 }, set: function(value) { console.log("Setting `o.bar` to", value) } }}) function Constructor(){} o = new Constructor(); // 上面的一句就相当于: o = Object.create(Constructor.prototype); // 当然,如果在Constructor函数中有一些初始化代码,Object.create不能执行那些代码 // 创建一个以另一个空对象为原型,且拥有一个属性p的对象 o = Object.create({}, { p: { value: 42 } }) // 省略了的属性特性默认为false,所以属性p是不可写,不可枚举,不可配置的: o.p = 24 o.p //42 o.q = 12 for (var prop in o) { console.log(prop) } //"q" delete o.p //false //创建一个可写的,可枚举的,可配置的属性p o2 = Object.create({}, { p: { value: 42, writable: true, enumerable: true, configurable: true } });
Polyfill
本polyfill的实现基于Object.prototype.hasOwnProperty。
if (typeof Object.create != 'function') { // Production steps of ECMA-262, Edition 5, 15.2.3.5 // Reference: http://es5.github.io/#x15.2.3.5 Object.create = (function() { //为了节省内存,使用一个共享的构造器 function Temp() {} // 使用 Object.prototype.hasOwnProperty 更安全的引用 var hasOwn = Object.prototype.hasOwnProperty]return function (O) { // 1. 如果 O 不是 Object 或 null,抛出一个 TypeError 异常。 if (typeof O != 'object') { throw TypeError('Object prototype may only be an Object or null'); } // 2. 使创建的一个新的对象为 obj ,就和通过 // new Object() 表达式创建一个新对象一样, // Object是标准内置的构造器名 // 3. 设置 obj 的内部属性 [[Prototype]] 为 O。 Temp.prototype = O; var obj = new Temp(); Temp.prototype = null; // 不要保持一个 O 的杂散引用(a stray reference)... // 4. 如果存在参数 Properties ,而不是 undefined , // 那么就把参数的自身属性添加到 obj 上,就像调用 // 携带obj ,Properties两个参数的标准内置函数 // Object.defineProperties() 一样。 if (arguments.length > 1) { // Object.defineProperties does ToObject on its first argument. var Properties = Object(arguments[1]); for (var prop in Properties) { if (hasOwn.call(Properties, prop)) { obj[prop] = Properties[prop]; } } } // 5. 返回 obj return obj; }; })(); }
规范
规范版本 | 规范状态 | 注解 |
---|---|---|
ECMAScript 5.1 (ECMA-262) Object.create | Standard | Initial definition. Implemented in JavaScript 1.8.5 |
ECMAScript 2015 (6th Edition, ECMA-262) Object.create | Standard |
浏览器兼容性
DesktopMobile
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | 5 | 4.0 (2) | 9 | 11.60 | 5 |
相关链接
Object.defineProperty
Object.defineProperties
Object.prototype.isPrototypeOf
John Resig's post on getPrototypeOf
相关文章推荐
- SQL Server中 sysobjects、syscolumns、systypes
- Object-C NSLog 常用输出基本数据类型格式
- BING++: A Fast High Quality Object Proposal Generator at 100fps
- flash object实现视频播放效果
- Xcode7使用MJ的NSObject+Value出现Too many arguments to function call,expected 0,have 3
- JSON使用ObjectCreationHandling 反序列化替换不重复的值
- Objective-c 客户端
- Objective-c 服务端
- NSObject
- 关于 Object.prototype.toString.call() 方法
- Objective-C 歌词解析
- Objective-C歌词解析
- OC lrc歌词解析
- ognl.MethodFailedException: Method "setEndtime" failed for object com.piptrade.action.tradetools.eCa
- ObjectAnimator 安卓属性动画简单入门
- Swift中的AnyObject和as
- Objective-C 引用计数
- 使用JSONObject.fromObject出现的问题
- Objective-c语言_点语法和@property
- Objective-c语言_便利初始化函数和便利构造器