解释Object.create(),new

时间:2015-07-21 20:15:55

标签: javascript object inheritance prototype

我知道这类问题已被提出并被回答了一百万次,但我仍然不明白这一点。

JavaScript中的所有内容都是一个对象。存在一个JavaScript运行时搜索方法和属性的原型链。这两件事很清楚。我(我想)也明白new statement does是什么。也许问题是我不明白Object.create的作用。我一直在使用以下JavaScript设计模式:

SuperClass = function(){
    this.superprop = 'some super property';
};

SubClass = function(){
    this.subprop = 'some (not so) super property';
};

SuperClass.prototype.someSuperMethod = function(){console.log("I'm super.")};

SubClass.prototype = Object.create(SuperClass.prototype);
SubClass.prototype.constructor = SubClass;

var instance = new SubClass();

instance.someSuperMethod(); // Great! That's super!

但是,我知道为什么我不能写:

  1. SubClass = Object.create(SuperClass);
  2. SubClass = SuperClass;
  3. SubClass = new SuperClass;
  4. SubClass.prototype = SuperClass.prototype;
  5. SubClass = new SuperClass();
  6. SubClass.prototype = SuperClass;
  7. (或上述任何组合)。简而言之,我想我不知道函数的.prototype属性是什么,或者为什么我需要Object.create这个原型如果我希望SubClass继承SupClass的所有内容。 / p>

    我也不了解SuperClass.prototype.constructor的含义。这个对象与SuperClass的不同之处是什么?

    我也不明白为什么我需要写new SubClass()而不是new Subclass。有什么区别?

1 个答案:

答案 0 :(得分:0)

好吧,我是这个问题的OP。但是,我将尝试对我的问题形成一个全面的答案(作为满意的全面答案)。

首先要做的事:JavaScript中的大部分内容都是一个对象。什么是对象? object is任何具有与之关联的方法和属性的东西。你可能会问:“好吧,字符串是一个对象吗?数字5是一个对象吗?”。这是一个有趣的问题。严格地说,没有。这些对JavaScript来说是如此基础,因为它们被称为基元。只有6 primitives in JavaScript:字符串,数字,布尔值,空值,未定义和符号(ECMAScript 6中的符号是新的,这是JavaScript所基于的最新标准 - 正式发布:2015年6月17日)。

对象的主要组件是基元。您可以让函数返回字符串或添加数字。通用对象可以是字符串或数字的容器:

var myGenericObject = {var1: "string 1",
                       var2: 42, 
                       var3: function(){
                                 console.log("do something.")
                             }
                      };

JavaScript中的所有对象都是Object类的子类,甚至是函数。不要混淆:虽然Function类是fundamental object,但函数仍然来自Object class,我想这使得Object类成为JavaScript中最基本的对象(这可能就是它被称为Object的原因) )。但是,Object类实际上是从null原语下降的(不要担心;这就是它结束的地方)。我现在侧面解决的概念称为原型继承,它是JavaScript的核心区别特征。

但是,JavaScript非常聪明。当您尝试访问将存在的方法时 因此,var testString = "hello" with是一个对象

首先,根据ECMAScript 5的new运算符

(稍等一下。我只是暂时保存我的进度)。