【问题标题】:Explain Object.create(), new解释 Object.create(), new
【发布时间】:2015-07-21 20:15:55
【问题描述】:

我知道这类问题已经被问过一百万次了,但我还是不明白。

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;

(或上述任何组合)。简而言之,我想我不知道函数的 .prototype 属性是什么,或者如果我希望 SubClass 继承 SupClass 的所有内容,我为什么需要 Object.create 这个原型。

我也不明白SuperClass.prototype.constructor 是什么意思。这个对象与SuperClass 有何不同?

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

【问题讨论】:

标签: javascript object inheritance prototype


【解决方案1】:

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

第一件事:JavaScript 中的大多数东西都是一个对象。什么是对象? object is 任何具有与之关联的方法和属性的事物。你可能会问:“好吧,字符串也是对象吗?数字 5 是对象吗?”。这是一个有趣的问题。严格来说,没有。这些对于 JavaScript 作为一种语言来说是如此的基础,以至于它们被称为原语。只有6 primitives in JavaScript:字符串、数字、布尔值、null、未定义和符号(符号是 JavaScript 所基于的最新标准 ECMAScript 6 中的新符号 - 正式发布时间: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 运算符

(稍后再说。我只是暂时保存我的进度)。

【讨论】:

  • "对象的主要组成部分是基元" - 不,对象可以保存任何值(基元和对象)。
猜你喜欢
  • 2016-12-04
  • 2012-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-12
  • 2012-05-08
相关资源
最近更新 更多