什么是o
?
如果我没有弄错的话,原型意味着F
将继承o
,但这就是我能理解的。
有人可以为我打破这个:
if (!Object.create) {
Object.create = (function () {
var F = function(){};
return function (o) {
if (arguments.length !== 1) {
throw new Error('Object.create implementation only accepts one parameter.');
}
F.prototype = o;
return new F();
};
}());
答案 0 :(得分:4)
o
是您传递给函数的参数。
例如:
var myObj = Object.create({
myFn: function(){}
});
然后你可以这样做:
myObj.myFn();
答案 1 :(得分:2)
该代码的上下文可以帮助您更好地理解它。
此polyfill涵盖了主要用例,该用例创建了一个新对象,其中已选择原型但未考虑第二个参数。 - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Polyfill
当环境未提供Object.create(proto [, propertiesObject ])
时,该代码旨在替代Object.create
。
因此,o
只是将作为您正在创建的新对象的原型的对象。
实际上,这意味着我们可以使用o
作为我们的超类(或者更正确o
是我们超类的原型)。
Mozilla文档中的示例清楚地说明了这一点:
//subclass extends superclass
Rectangle.prototype = Object.create(Shape.prototype);
回答评论时,评论框感觉有点太长了:
o
是您要继承的对象的原型。从技术上讲,它也是一个对象,JS中的所有东西都是一个对象。 How is almost everything in Javascript an object?
为什么要继承其他对象? What's the point of OOP?
这条线做什么? F.prototype = o;
让我们重复完整的代码,但注释除外:
// if the execution environment doesn't have object.create, e.g. in old IE
if (!Object.create) {
// make object.create equal to something
Object.create = (function(){
// create a new object F which can be inherited from
function F(){}
// return a function which
return function(o){
// throw an error if
if (arguments.length != 1) {
throw new Error('Object.create implementation only accepts one parameter.');
}
// force F to inherit o's methods and attributes
F.prototype = o
// return an instance of F
return new F()
}
})() // this is an IIFE, so the code within is automatically executed and returned to Object.create
}