为什么有这两个函数,创建和构造
是有用的if (!Object.create) {
Object.create = function(base) {
function F() {};
F.prototype = base;
return new F();
}
}
if (!Object.construct) {
Object.construct = function(base) {
var instance = Object.create(base);
if (instance.initialize)
instance.initialize.apply(instance, [].slice.call(arguments, 1));
return instance;
}
}
答案 0 :(得分:1)
Object.create仅在JavaScript 1.8.5中引入,它允许使用指定的原型和一组属性创建新对象。您可能希望发布的代码的原因是在不支持Object.create
的旧浏览器中填充该函数。但是,要小心,因为polyfill实现仅支持第一个参数。
以下是您可以使用它的方法:
var parentObject = { name: 'test' },
childObject = Object.create(parentObject);
console.log(childObject.name); // -> test
至于Object.construct
,我在规范中没有找到任何对此函数的引用,但从我所看到的,它与Object.create
的作用相同,但另外,它会调用initialize
对象在新创建的对象的上下文中的base
函数,并将传递给您在base
参数之后可能已经传递的附加参数。
例如:
var parentObject = {
initialize: function (name) {
this.name = name;
}
};
var childObject = Object.construct(parentObject, 'test');
console.log(childObject.name); // -> test
答案 1 :(得分:0)
“我们”没有。 Object.create
是一种在现代浏览器中创建对对象具有非常低级别访问权限的对象的方法(那些将ES5的这部分运行到规范的对象)。
var bob = Object.create(Person.prototype, { name : {
writeable : false,
configurable : false,
value : "Bob" }});
bob
继承自Person
。
bob.name
现在等于“Bob”
bob.name
无法重写
bob.name
无法更改为其他数据类型(number / boolean / NaN / null / etc)。
bob.name
无法删除,除非完全删除bob
。
这只适用于现代浏览器。
Object.create
polyfill只执行继承部分,因为旧版本的JavaScript不允许访问对象的可枚举,或者它们是可写的还是特定于类型的等等。
因此,它们不能被填充。
没人 需要 Object.create
。没有人不做系统架构(无论是AJAX库还是新的基于NodeJS的银行系统或云操作系统或其他),就是这样。即使这样,只有在你可以保证浏览器使用现代版本的JS时才有用。