我知道一般的面向对象编程原则,如封装,继承,多态,抽象等
但现在想从JavaScript的角度理解这些概念。 有人可以采用一个非常基本的例子来运行它们如何在JS上下文中工作(封装,继承,多态,抽象)
我在线阅读了很多这些内容,但文章让我更加困惑。
谢谢。
答案 0 :(得分:20)
我将描述道格拉斯克罗克福德模式,以模仿面向对象编程语言中使用的样式。它不使用原型继承。因此,它的效率稍差,因为每个对象都必须存储对每个方法的引用。但它仅用于说明目的。
封装:
function MyClass (a, b)
{
this.publicProperty = 1;
var _privateProperty = 2;
function _privateMethod () {
// only private methods and privileged methods can call this
};
this.publicMethod = function () {
// can access _privateProperty and call _privateMethod
};
}
MyClass.classMethod = function () {
// not tied to any instances
};
只需使用var instance = new MyClass(a, b);
继承:
function DerivedClass(a, b, c)
{
// must explicitly call superclass constructor, like in Java
MyClass.apply(this, arguments);
this.anotherProperty = 3;
function _anotherPrivateMethod() { };
this.publicMethod = function () {
// can access _privateProperty and call _privateMethod
};
}
DerivedClass.classMethodMethod = function ()
{
// not tied to any instances
};
JavaScript中的多态性主要由Duck Typing(http://en.wikipedia.org/wiki/Duck_typing)取代。开发人员通常将对象下的方法/属性分组,您只需测试这些对象的存在。例如,这就是检测newfangles浏览器功能的方式。
抽象与多态性紧密相关 - 只要某些东西支持接口,你通常不关心它在底层是如何工作的。因此,您可以下载一个Javascript库,并根据其文档使用它。
希望这有帮助。
答案 1 :(得分:5)
我认为最有趣的是封装,因为很多人都没有正确使用它。
让我们以一个简单的对象为例
var Person = function( firstName, lastName, isMr ) {
var prefix = isMr ? "Mr." : "Mrs." ;
this.getFullName = function() { return prefix + " "
+ firstName + " " + lastName }
}
var p = new Person ("guy","mograbi", true);
p.getFullName(); // => "Mr. guy mograbi"
// p.prefix ==> causes an error.
继承 - 只是扩展原型
var Superhero = function(){
Person.call(this);
}
然而,适当的继承本身就是一个问题。 查看https://stackoverflow.com/a/4985616/1068746
多态性 - 非常简单,给定一个实现“getFullName”的新原型
var Child = function(){
this.getFullName = function(){ return "not allowed to talk with strangers" }
}
给定function(a){ a.getFullName() }
如果a是Person,你将获得全名,如果是Child,你将获得“不允许......”。
抽象 - 更像是一种类型安全的语言。 https://stackoverflow.com/a/4082496/1068746
答案 2 :(得分:4)
您可以使用函数定义单个对象
var apple = new function() {
this.type = "macintosh";
this.color = "red";
this.getInfo = function () {
return this.color + ' ' + this.type + ' apple';
};
}
使用下面给出的
apple.color = "reddish";
alert(apple.getInfo());
new function(){...}
同时做两件事:定义一个函数(一个匿名构造函数)并用new调用它。
答案 3 :(得分:2)