在与数字公司的一位架构师会面时,有人问我面向对象和非面向对象的 javascript 之间有什么区别。
不幸的是,我无法正确回答这个问题,我只是回答我认为 javascript 只是面向对象的语言。
我知道通过 javascript 的面向对象设计,您可以拥有通常的 oop 过程,例如多态性。
我们对此有何看法?有这样的区别吗?我们可以把两者分开吗?
在与数字公司的一位架构师会面时,有人问我面向对象和非面向对象的 javascript 之间有什么区别。
不幸的是,我无法正确回答这个问题,我只是回答我认为 javascript 只是面向对象的语言。
我知道通过 javascript 的面向对象设计,您可以拥有通常的 oop 过程,例如多态性。
我们对此有何看法?有这样的区别吗?我们可以把两者分开吗?
大多数面向对象的语言都可以以非面向对象的方式使用。(大多数非 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
函数作用于给它的对象,假设它知道它们的属性名称。这有点像在struct
s 上工作的 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 目前在封装方面“还可以”[使用闭包];在下一个版本中[以两种相关方式] 的封装方面会变得更好。)
完全有可能在不声明类或原型的情况下编写一段 Javascript 代码。当然你会使用对象,因为 API 和 DOM 是由它们组成的。但是您实际上并不需要以 OO 方式思考。
但也可以以彻底的 OO 方式编写 Javascript - 创建大量类/原型,利用多态性和继承,根据对象之间传递的消息设计行为,等等。
我怀疑这是面试官希望从你那里得到的区别。