Javascript - 对象表示法脚本与面向对象脚本

Javascript - Object Notation Script vs Object Oriented Script

我从事 Web 应用程序的工作已经很长时间了。与最有经验的技术架构师合作。在带有名称空间的对象表示法中,我到处都使用 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 错误。

这两种方法之间的唯一区别是前者(文字表示法)创建一个特定的对象,而后者定义一个构造函数,可用于创建对象。这是只能拥有一个对象(此处关于对象克隆的星号参数)与能够从同一模板实例化许多相似对象之间的区别 ("class")。

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

Cant we have object oriented javascript with namespace notation(former one)? If so can you create an object of that and inherit them.

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

Why can't I have private fields in first approach(namespace)? If I declare any field with var, javascript error is thrown.

因为 "private fields" 不存在于 Javascript 中。您可以使用 closures/variable 作用域的特性来模拟类似 "private properties" 的东西。但是为此你显然需要一个函数。使用对象字面量表示法,您不会明白这一点。