面向对象和非面向对象javascript的区别

面向对象和非面向对象javascript的区别,javascript,Javascript,在与数字公司的一位架构师的一次会议上,我被问及面向对象和非面向对象javascript之间的区别 不幸的是,我不能正确回答这个问题,我只是回答我认为javascript只是面向对象的语言 我知道,使用面向对象的javascript设计,您可以使用常见的oop过程,例如多态性 我们对此有何看法?有这样的区别吗?我们能把两者分开吗?完全可以编写一段Javascript代码,而不必声明类或原型。当然,您会使用对象,因为API和DOM都是由它们组成的。但你真的不需要用OO的方式思考 但也可以用完全面向对

在与数字公司的一位架构师的一次会议上,我被问及面向对象和非面向对象javascript之间的区别

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

我知道,使用面向对象的javascript设计,您可以使用常见的oop过程,例如多态性


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

完全可以编写一段Javascript代码,而不必声明类或原型。当然,您会使用对象,因为API和DOM都是由它们组成的。但你真的不需要用OO的方式思考

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


我怀疑这就是面试官希望从你身上得到的区别。

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

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


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

大多数面向对象语言都可以以非面向对象的方式使用。(大多数非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"

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

大多数面向对象语言都可以以非面向对象的方式使用。(大多数非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"
这是更面向对象的。数据和行为都由
Person
构造函数定义。如果需要,您甚至可以封装(比如)born值,这样就无法从其他代码访问它。(JavaScript目前在封装方面“还可以”[使用闭包进行封装];在下一个版本中,它在封装方面会变得更好