0

在与数字公司的一位架构师会面时,有人问我面向对象和非面向对象的 javascript 之间有什么区别。

不幸的是,我无法正确回答这个问题,我只是回答我认为 javascript 只是面向对象的语言。

我知道通过 javascript 的面向对象设计,您可以拥有通常的 oop 过程,例如多态性。

我们对此有何看法?有这样的区别吗?我们可以把两者分开吗?

4

2 回答 2

3

大多数面向对象的语言都可以以非面向对象的方式使用。(大多数非 OO 语言也可以以 OO 方式使用,到了这一点,你只需要付出努力。)JavaScript 特别适合以过程和函数方式使用(并且也非常适合以各种OO方式使用)。这是一种非常非常灵活的语言。

例如,这里有两种方法可以写一些需要处理关于人的信息的东西,说明他们的年龄:

程序:

// Setup
function showAge(person) {
    var now = new Date();
    var years = now.getFullYear() - person.born.getFullYear();
    if (person.born.getMonth() < now.getMonth()) {
        --years;
    }
    // (the calculation is not robust, it would also need to check the
    // day if the months matched -- but that's not the point of the example)
    console.log(person.name + " is " + years);
}

// Usage
var people = [
    {name: "Joe",      born: new Date(1974, 2, 3)},
    {name: "Mary",     born: new Date(1966, 5, 14)},
    {name: "Mohammed", born: new Date(1982, 11, 3)}
];
showAge(people[1]); // "Mary is 46"

这不是特别面向对象的。该showAge函数作用于给它的对象,假设它知道它们的属性名称。这有点像在structs 上工作的 C 程序。

这是 OO 形式的相同内容:

// Setup
function Person(name, born) {
    this.name = name;
    this.born = new Date(born.getTime());
}
Person.prototype.showAge = function() {
    var now = new Date();
    var years = now.getFullYear() - this.born.getFullYear();
    if (this.born.getMonth() > now.getMonth()) {
        --years;
    }
    // (the calculation is not robust, it would also need to check the
    // day if the months matched -- but that's not the point of the example)
    console.log(person.name + " is " + years);
};

// Usage
var people = [
    new Person("Joe",      new Date(1974, 2, 3)),
    new Person("Mary",     new Date(1966, 5, 14)),
    new Person("Mohammed", new Date(1982, 11, 3))
];
people[1].showAge(); // "Mary is 46"

这更面向对象。数据和行为都由Person构造函数定义。如果您愿意,您甚至可以封装(比如说)该born值,使其无法从其他代码访问。(JavaScript 目前在封装方面“还可以”[使用闭包];在下一个版本中[以两种相关方式] 的封装方面会变得更好。)

于 2013-05-01T11:16:06.233 回答
0

完全有可能在不声明类或原型的情况下编写一段 Javascript 代码。当然你会使用对象,因为 API 和 DOM 是由它们组成的。但是您实际上并不需要以 OO 方式思考。

但也可以以彻底的 OO 方式编写 Javascript - 创建大量类/原型,利用多态性和继承,根据对象之间传递的消息设计行为,等等。

我怀疑这是面试官希望从你那里得到的区别。

于 2013-05-01T11:14:18.767 回答