您的位置:首页 > 移动开发 > Objective-C

firefox-Developer开发者站点——关于Object.create()新方法的介绍

2015-12-11 11:12 686 查看
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/create

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
StandardInitial definition. Implemented in JavaScript 1.8.5
ECMAScript 2015 (6th Edition, ECMA-262)
Object.create
Standard

浏览器兼容性

Desktop

Mobile

FeatureChromeFirefox (Gecko)Internet ExplorerOperaSafari
Basic support54.0 (2)911.605

相关链接

Object.defineProperty


Object.defineProperties


Object.prototype.isPrototypeOf


John Resig's post on getPrototypeOf
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: