Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是JavaScript';s&x201C;新&x201D;被认为有害的关键词(第2部分)?_Javascript - Fatal编程技术网

是JavaScript';s&x201C;新&x201D;被认为有害的关键词(第2部分)?

是JavaScript';s&x201C;新&x201D;被认为有害的关键词(第2部分)?,javascript,Javascript,通过阅读下面的内容,我觉得大多数答案都忽略了为什么有些人(Crockford)选择不使用“new”关键字这一点。这并不是为了防止意外调用没有“new”关键字的函数 根据Crockford关于原型继承的以下内容,他实现了一种对象创建技术,该技术更清楚地展示了JS的原型本质。这项技术现在甚至在中实现 他反对使用新技术的论点可以更清楚地概括为: “这种间接方式的目的是让受过经典训练的程序员更熟悉这种语言,但没有做到这一点,正如我们从Java程序员对JavaScript的极低评价中看到的那样。JavaS

通过阅读下面的内容,我觉得大多数答案都忽略了为什么有些人(Crockford)选择不使用“new”关键字这一点。这并不是为了防止意外调用没有“new”关键字的函数

根据Crockford关于原型继承的以下内容,他实现了一种对象创建技术,该技术更清楚地展示了JS的原型本质。这项技术现在甚至在中实现

他反对使用新技术的论点可以更清楚地概括为:

“这种间接方式的目的是让受过经典训练的程序员更熟悉这种语言,但没有做到这一点,正如我们从Java程序员对JavaScript的极低评价中看到的那样。JavaScript的构造器模式对经典的人群没有吸引力。它还模糊了JavaScript的真正原型性质。因此,知道如何有效使用该语言的程序员寥寥无几。”

<>我不一定认为“新”有害,但我同意它确实“掩盖了JavaScript的真正原型性质”,因此我在这点上必须同意克洛克福德。


对于使用“更清晰”的原型对象创建技术,而不是使用“新的”原型对象创建技术,您有什么看法“关键字?

你说得对,使用
new
被认为是有害的,因为它没有充分强调JavaScript中的OO是原型。主要问题是,它的行为太像经典类,人们不应该考虑
。人们应该考虑对象的设计,并将现有对象作为蓝图创建新对象

new
是JavaScript接受类似Java的语法以获得“流行”的时代的残余

现在,我们使用和使用原型OO

不再需要
新的

在ES5普遍实施之前(只有FF3.6和IE8松懈),我们使用了
new
,因为我们几乎没有选择<原型
是进行原型继承的方法


我最近写了一篇文章,虽然我还需要解决一些用法上的问题。重要的是将对象与工厂函数分开。

我没有发现
new
对我来说模糊了语言的原型本质。当然,我现在已经花了几年的时间来熟悉这门语言(最初我犯了一个错误,就是潜入并开始编写代码,而不知道这门语言实际上是如何工作的,这是我的初始成本)

我发现
new
在函数名前加“new”前缀或使用helper函数等表达方式并不是:

var fido      = new Dog();          // Simple, clear
var rover     = Dog();              // Very unclear (fortunately people mostly don't do this, but I've seen it)
var scruffles = newDog();           // Clearer, but hacky
var fifi      = Object.create(Dog); // (Crockford) Verbose, awkward, not esp. clear
无论是原型的还是基于类的(大部分都与
new
关键字无关),我仍然认为最好的方法是将功能组合到构建块(对象或类或其他)中,然后是我可以在不影响那些构建块的情况下处理的特定对象。对我来说,
new
作为一种明确识别我意图的手段既不经典也不典型,只是很清楚

对我来说,
new
与原型本身一样,是JavaScript的重要组成部分,其功能非常灵活。问题是没有冲突

实际上,有更多的程序员习惯于使用
new
来创建新的实例,尽管Crockford付出了努力,但这在JavaScript社区中还是一种普遍的做法(不要误解,我非常尊重Crockford)。如果我正在安排一个项目,我不想再培训的麻烦

这并不是说,您在JavaScript中定义原型对象层次结构的方式是一种美丽和永恒的乐趣。这是一个巨大的痛苦,尤其是没有ECMAScript 5增强。但是定义一个helper函数来帮助您连接层次结构(无论您想调用它们什么),您就完成了。(请参阅下面的更新。)

[是的,在没有
new
的情况下调用构造函数的整个过程真的是一个骗局(你说过你也不认为这是一个要点)。你几乎从未在现实世界中看到过这种情况。事实上,JavaScript用它做的一些事情非常好(例如,
String
Number
cast的方式);其他部分(日期
Date
所做的**抖动**)就没那么好了……]


从ES2015(ES6)开始,由于新的类语法,创建原型和构造函数的层次结构是轻而易举的事。不再需要帮助程序

class Base {
    constructor(name) {
        this.name = name;
    }
    greeting() {
        return "Hi, I'm " + this.name;
    }
}

class Derived extends Base {
    constructor(name, age) {
        super(name);
        this.age = age;
    }
    greeting() {
        return super.greeting() + " and I'm " + this.age + " years old";
    }
}

当然,这并不意味着我们什么都需要它们。我使用
对象。当我需要扩展单个对象时,创建
会产生很大的效果。

我使用
new
的最大问题是它违反了打开/关闭原则。由于
new
操作
的值的方式,构造函数是CLO这意味着,如果您需要扩展它,您必须修改它,可能会中断进程中的调用方

一些工厂如何扩展
new
不允许的示例:

  • 隐藏对象创建的细节。(以下是您可能希望这样做的示例)

  • 在factory对象上存储可变原型和初始化函数,可通过
    this
    访问(使用
    new
    this
    始终指新创建的对象)

  • 通过允许您向factory对象添加功能(可扩展多态性),扩展可能的对象类型池

  • 使用
    .call()
    .apply()
    (扩展代码重用)在实例化过程中重新定义此
    的含义

  • 将代理返回到另一个内存空间中的新对象(iframe、window、其他计算机)

  • 条件所有