3

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

2 回答 2

4

o是您传递给函数的参数。

例如:

var myObj = Object.create({
        myFn: function(){}
});

然后你可以这样做:

myObj.myFn();
于 2013-07-31T19:16:31.427 回答
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 中的一切都是一个对象。Javascript 中的几乎所有东西都是一个对象?.

为什么要从另一个对象继承?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
}
于 2013-07-31T19:26:14.867 回答