`
jobar
  • 浏览: 347244 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

面向对象的JS(2) JavaScript对面向对象的支持

    博客分类:
  • OOJS
 
阅读更多
1 实例方法
实例方法是由实例对象访问的方法,实例对象由new操作符创建。实例成员通过this关键字、prototype、构造器闭包或者Object.defineProperty来创建
function Cat(name) {
    var voice = "Meow";
    this.name = name;
    this.say = function () {
        return voice;
    }
}
Cat.prototype.eat = function () {
    return "Eating";
}
var cat = new Cat("Fluffy");
Object.defineProperty(cat, "numLegs", {
    value: 4,
    writable: true,
    enumerable: true,
    configurable: tr
    ue
});
console.log(cat.name); // Fluffy
console.log(cat.numLegs); // 4
console.log(cat.say()); // Meow
console.log(cat.eat()); // Eating

2 静态方法
JavaScript中没有对静态成员的直接支持。构造函数可以用来创建静态成员,静态成员不能被"this"关键字访问。
公有静态成员例子:
function Factory() {}
// public static method
Factory.getType = function () {
    return "Object Factory";
};
// public static field
Factory.versionId = "F2.0";
Factory.prototype.test = function () {
    console.log(this.versionId); // undefined
    console.log(Factory.versionId); // F2.0
    console.log(Factory.getType()); // Object Factory
}
var factory = new Factory();
factory.test();

私有静态成员例子:
var Book = (function () {
    // private static field
    var numOfBooks = 0;
    // private static method
    function checkIsbn(isbn) {
        if (isbn.length != 10 && isbn.length != 13)
            throw new Error("isbn is not valid!");
    }

    function Book(isbn, title) {
        checkIsbn(isbn);
        this.isbn = isbn;
        this.title = title;
        numOfBooks++;
        this.getNumOfBooks = function () {
            return numOfBooks;
        }
    }
    return Book;
})();
var firstBook = new Book("0-943396-04-2", "First Title");
console.log(firstBook.title); // First Title
console.log(firstBook.getNumOfBooks()); // 1
var secondBook = new Book("0-85131-041-9", "Second Title");
console.log(firstBook.title); // First Title
console.log(secondBook.title); // Second Title
console.log(firstBook.getNumOfBooks()); // 2
console.log(secondBook.getNumOfBooks()); // 2

3 抽象类型:
JavaScript是一种弱类型的语言,所以定义变量时不需要指定具体的类型。这减少了像接口这样的抽象层次需要。但当我们需要继承的时候,我们可以将一些公共函数放入抽象类中。
(function () {
    var abstractCreateLock = false;
    // abstract type
    function BaseForm() {
        if (abstractCreateLock)
            throw new Error("Can’t instantiate BaseForm!");
    }
    BaseForm.prototype = {};
    BaseForm.prototype.post = function () {
        throw new Error("Not implemented!");
    }

    function GridForm() {}
    GridForm.prototype = new BaseForm();
    abstractCreateLock = true;
    GridForm.prototype.post = function () {
        // ...
        return "Grid is posted.";
    }
    window.BaseForm = BaseForm;
    window.GridForm = GridForm;
})();
var myGrid = new GridForm();
console.log(myGrid.post()); // Grid is posted.
var myForm = new BaseForm(); // Error: Can’t instantiate BaseForm!

4 接口
在JavaScript中无直接的接口或者虚类支持。但可以由类似下面的代码来模拟,只留一个方法签名检查。
var Interface = function (name, methods) {
    this.name = name;
    // copies array
    this.methods = methods.slice(0);
};
Interface.checkImplements = function (obj, interfaceObj) {
    for (var i = 0; i < interfaceObj.methods.length; i++) {
        var method = interfaceObj.methods[i];
        if (!obj[method] || typeof obj[method] !== "function")
            throw new Error("Interface not implemented! Interface: " + interfaceObj.name + "Method: " + method);
    }
};
var iMaterial = new Interface("IMaterial", ["getName", "getPrice"]);

function Product(name, price, type) {
    Interface.checkImplements(this, iMaterial);
    this.name = name;
    this.price = price;
    this.type = type;
}
Product.prototype.getName = function () {
    return this.name;
};
Product.prototype.getPrice = function () {
    return this.price;
};
var firstCar = new Product("Super Car X11", 20000, "Car");
console.log(firstCar.getName()); // Super Car X11
delete Product.prototype.getPrice;
var secondCar = new Product("Super Car X12", 30000, "Car"); // Error: Interface not implemented!

5 单例对象:
如果只使用对象的一个实例,可以考虑用单例模式:
var Logger = {
    enabled: true,
    log: function (logText) {
        if (!this.enabled)
            return;
        if (console && console.log)
            console.log(logText);
        else
            alert(logText);
    }
}

或者
function Logger() {}
Logger.enabled = true;
Logger.log = function (logText) {
    if (!Logger.enabled)
        return;
    if (console && console.log)
        console.log(logText);
    else
        alert(logText);
};
Logger.log("test"); // test
Logger.enabled = false;
Logger.log("test"); //
分享到:
评论

相关推荐

    面向对象JavaScript精要(英文原版pdf)

    尽管JavaScript不是传统意义上的面向对象语言,但它提供了一些独特的特性,使其能够支持面向对象编程。 - **原型链**:JavaScript使用原型链来实现继承。每个对象都有一个内部属性[[Prototype]],指向其原型对象。...

    Javascript面向对象编程.

    在提供的资源中,《代码之美》PDF文件可能包含了关于编程实践和代码风格的指导,而《Javascript面向对象编程》PPT可能更具体地阐述了JavaScript OOP的细节和示例。学习这些材料将有助于深入理解JavaScript的面向对象...

    面向对象JavaScript开发

    JavaScript,作为一种广泛应用于Web开发的动态脚本语言,最初被设计为简单的客户端脚本语言,但随着技术的发展,它已经发展出了丰富的面向对象编程(OOP)特性。面向对象JavaScript开发是现代Web开发中不可或缺的一...

    Javascript 面向对象的JavaScript进阶

    ### JavaScript面向对象进阶知识点详解 #### 8.1 面向对象编程的基本特性 在探讨面向对象的JavaScript之前,我们首先需要了解面向对象编程(Object-Oriented Programming, OOP)的基本特性:封装性、抽象性、继承...

    js 面向对象实例

    在JavaScript面向对象的上下文中,我们可以创建专门处理Canvas绘图的类,封装复杂的绘图逻辑: ```javascript class Circle { constructor(x, y, radius) { this.x = x; this.y = y; this.radius = radius; } ...

    JavaScript面向对象的支持

    JavaScript是一种广泛应用于Web开发的脚本语言,它虽然支持面向对象编程,但其面向对象的实现方式与其他传统面向对象语言(如Java或C++)有所不同。JavaScript中的面向对象特性主要体现在以下几个方面: 1. **基于...

    面向对象javascript

    面向对象JavaScript教程 面向对象JavaScript是一种编程范式,它将JavaScript脚本编写转换为面向对象的思想。面向对象的JavaScript开发可以极大地提高开发效率和代码健壮性。 面向对象的JavaScript的特征包括: * ...

    JavaScript面向对象编程指南.pdf

    JavaScript作为一门浏览器语言的核心思想;面向对象编程的基础知识及其在... 《JavaScript面向对象编程指南》着重介绍JavaScript在面向对象方面的特性,展示如何构建强健的、可维护的、功能强大的应用程序及程序库

    JavaScript面向对象编程指南

    《JavaScript面向对象编程指南》内容包括:JavaScript作为一门浏览器语言的核心思想;面向对象编程的基础知识及其在JavaScript中的运用;数据类型、操作符以及流程控制语句;函数、闭包、对象和原型等概念,以代码...

    JavaScript面向对象编程指南(第2版).rar

    JavaScript是一种广泛...通过深入学习这本《JavaScript面向对象编程指南(第2版)》,开发者不仅能掌握JavaScript的面向对象编程基础,还能了解到实际项目中如何有效地运用这些知识,提升编程技巧和解决问题的能力。

    JAVASCRIPT 面向对象编程精要

    ### JavaScript面向对象编程精要 #### 一、引言 JavaScript是一种灵活且强大的脚本语言,它虽然起源于一种简单的浏览器脚本语言,但随着时间的发展,JavaScript已经成为了一种功能全面的编程语言,尤其是在Web开发...

    javascript面向对象框架

    "javascript面向对象框架"这一主题涵盖了JavaScript中实现面向对象编程的框架,特别是Prototype和MooTools这两个优秀的库。 Prototype是JavaScript的一个开源库,它扩展了JavaScript的基本对象和函数,提供了强大的...

    javascript 经典面向对象设计

    2. **JavaScript中的面向对象编程** - JavaScript与传统面向对象语言的区别 - 原型链 - 构造函数 - 类与继承 - 静态属性与方法 3. **设计模式** - 单例模式 - 工厂模式 - 抽象工厂模式 - 建造者模式 - ...

    javascript面向对象编程指南 2nd

    javascript面向对象编程指南 2nd英文版,英文名:Object-Oriented JavaScript。 What you will learn from this book The basics of object-oriented programming, and how to apply it in the JavaScript ...

    javascript面向对象编程

    面向对象编程的基础知识及其在JavaScript中的运用;数据类型、操作符以及流程控制语句;函数、闭包、对象和原型等概念,以代码重用为目的的继承模式;BOM、DOM、浏览器事件、AJAX和JSON;如何实现JavaScript中缺失的...

    面向对象Javascript核心支持代码分享

    但在这段核心支持代码中,我们看到的是对旧版JavaScript编程模式的反映,尽管这些模式已经在很大程度上被新的语法和工具取代,但在学习和理解JavaScript面向对象编程的发展历程方面,它们仍然具有重要价值。...

Global site tag (gtag.js) - Google Analytics