javascript新手:不确定函数(o)是什么意思

时间:2013-07-31 19:13:49

标签: javascript

什么是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();
  };
}());

2 个答案:

答案 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
}