面向对象的JavaScript示例

时间:2013-02-20 05:02:57

标签: javascript html css

我知道一般的面向对象编程原则,如封装,继承,多态,抽象等

但现在想从JavaScript的角度理解这些概念。 有人可以采用一个非常基本的例子来运行它们如何在JS上下文中工作(封装,继承,多态,抽象)

我在线阅读了很多这些内容,但文章让我更加困惑。

谢谢。

4 个答案:

答案 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)