【问题标题】:Javascript - Object Notation Script vs Object Oriented ScriptJavascript - 对象表示法脚本与面向对象的脚本
【发布时间】:2016-06-18 01:33:24
【问题描述】:

我从事网络应用程序的工作已经很长时间了。与最有经验的技术架构师合作。我到处使用带有命名空间的对象表示法中的 javascript。

var web = {};
web.app = {};
web.app.customer = {
    name: 'John',
    getName: function(){
        return 'The name is ' + this.name;
    }
};

document.write(web.app.customer.getName());

但是,当我寻找任何面向对象的 javascript 时,我们会提供函数并通过调用其构造函数来创建它的对象。

function Customer(name){
    this.name = name;
    this.getName = function(){
        return 'The name is ' + this.name;
    }
}

var cust = new Customer('Bob');
document.write(cust.getName());

我不确定为什么架构师总是建议我使用前一种方法(命名空间)。我从未使用过后一种方法,而后一种是面向对象的 javascript。

  1. 我们不能有带有命名空间表示法的面向对象的javascript(前一个)吗?如果是这样,您可以创建一个对象并继承它们。
  2. 为什么我不能在第一种方法(命名空间)中有私有字段?如果我用 var 声明任何字段,则会引发 javascript 错误。

【问题讨论】:

  • 前者,如果你有100个客户,你会为每个客户写getName函数吗?
  • @RemcoGerlich - 这就是问题所在。为什么要拥有 100 个客户?我从未使用过这种类型,在 javascript 中创建了 100 个客户对象。你能举个例子,为什么我们要在 javascript 中创建多个对象?

标签: javascript javascript-objects javascript-namespaces


【解决方案1】:

这两种方法的唯一区别是前者(字面符号)创建一个特定的对象,而后者定义了一个可用于创建对象的构造函数。只能拥有一个对象(这里是关于对象克隆的星号参数)和能够从同一个模板(“类”)实例化许多相似对象之间的区别。

两者都同样有效,具体取决于您想要什么。两者都是面向对象的。

我们不能有带有命名空间表示法的面向对象的javascript(前一个)吗?如果是这样,您可以创建一个对象并继承它们。

web.app.Customer = function (name) {
   ..
};

为什么我不能在第一种方法(命名空间)中拥有私有字段?如果我用 var 声明任何字段,则会引发 javascript 错误。

因为 Javascript 中不存在“私有字段”。您可以使用闭包/变量范围的特性来模拟“私有属性”之类的东西。但为此,您显然需要一个函数。使用对象字面量表示法,您无法理解。

【讨论】:

  • 谢谢。我在 asp.net 和 mvc 中从事 web 开发 javascript 已经将近 9 年了。但是,我从来没有使用过后一种方法,函数和函数的创建对象。我总是使用字面符号。也建议这样做。我可以知道为什么吗?另外,您在编程经验中使用了什么?
  • 您是否曾经使用过任何要求您在任何时候使用new 的Javascript 库?同样:这是单例对象和可以构造许多新对象的构造函数之间的区别。如果您从未发现对后者的需求,那么您可能还没有编写非常复杂的可重用代码,或者您没有意识到这可能会使您受益。
  • 谢谢。感谢您的快速回复。您能否通过后一个示例与我分享您的经验。基于需求更通用。我正在尝试根据实时要求学习 JavaScript。
  • 您是否曾用任何语言编写过任何使用类和构造函数的代码?使用它们的原因在任何地方都是相同的,并且是 OOP 的基本部分。
  • 是的,确实如此。我在 C# 中创建了对象。但从来没有在 JavaScript 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-13
  • 1970-01-01
  • 2019-11-20
  • 1970-01-01
  • 2019-03-20
  • 2016-09-02
相关资源
最近更新 更多