`
jessige_27
  • 浏览: 1048 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Javascript - 类的封装

阅读更多
类的封装 要干的事情如下


实际上就是一个function
同时也是这个类的构造方法
可以使用new创建该类的实例
new出的对象 有属性 有方法

属性和方法性质不同 因此定义的方式也不同
——实际上方法是一种特殊形式的属性

属性
每个实例单独所有 多个实例之间互不影响
因此要在构造方法中初始化实例的属性
——每次执行new时构造方法都会执行 会产生新的属性
——在其中定义方法当然也会 但不推荐 耗内存

方法
所有实例共有 创建多个实例不会产生新的function
因此要在类的prototype中定义实例的方法
——prototype中的方法会被所有实例共有
——在其中定义属性当然也会 但不推荐 除非你知道自己在做什么

至于private 算了吧
Javascript里没private 硬要实现的话虽然也能 但是有点不伦不类
按照惯例 在属性或方法名前加一个下划线 声明为私有
外面看见这个不要动 假装没看见就好了

至于static 这个容易
var Class = function() {};
Class.field = "";
Class.method = function() {};
没必要多说

单例
更不用费什么劲了
var Singleton = {
    field: "",
    method: function() {
    }
};

命名空间 这个很有必要 尤其是在复杂的应用中
不过现在这个不是重点 日后详谈

原则
简单
高效
Javascript就是Javascript而不是别的什么
——不要觉得Java或其它语言有什么Javascript就该有什么
或许使用各种变态的方式可以实现 但很别扭 更不优雅

终于 到了 正题

偶然看见了 alzui类封装的演化过程
以前也曾经干过类似的事情 但是用了好多代码
就没想过这件事情可以这么简单
仔细的研究了代码 佩服得不得了
不过貌似演化的最终结果有冗余的代码
实在没办法理解是否作者更深远的意图
在原文下提了 暂时还没得到作者的回复

下面是按照个人想法对作者最终版本的简化
貌似 挺好 没有问题
function _class(className, classImp){  
    var clazz = function(){  
        this._init.apply(this, arguments);  
    };  
    window[className] = clazz;  
    classImp.apply(clazz.prototype);  
}


其实演化还可以继续的

1. 干掉了那个傀儡 并改用constructor
因为那个傀儡实际上也没什么用
而_init是Java的 而且是见不得人的
constructor 才是Javascript的
Javascript内置的所有的类的对象 都有constructor属性
指向类的本身 详见本文末尾测试代码
window.$Class = function(name, SRC) {
    var src = new SRC();
    window[name] = src.constructor;
    window[name].prototype = src;
};


定义类
// define Class
$Class("Guy", function() {
    this.constructor = function(name) {
        this.name = name;
        this.friends = [];
    };
    this.makeFriendWith = function(guy) {
        this.friends.push(guy.name);
    };
});


2. 再省掉一步 用JSON的格式定义类 更直观
或许这个可以叫做final版了 没办法再简单了
window.$Class = function(name, src) {
    src.constructor.prototype = src;
    window[name] = src.constructor;
};


定义类
$Class("Guy", {
    constructor: function(name) {
        this.name = name;
        this.friends = [];
    },
    makeFriendWith: function(guy) {
        this.friends.push(guy.name);
    }
});


测试
适用于以上两种方式
要用到JSON2
Firefox已内置 其它浏览器未知 sb-ie肯定没有
json2.js

测试代码
var minglq = new Guy("MingLQ");
var luoluo = new Guy("Luoluo");
minglq.makeFriendWith(luoluo);
luoluo.makeFriendWith(minglq);
var ____ = "--------------------------------";
alert([
    JSON.stringify(minglq),
    JSON.stringify(luoluo),
    ____,
    "minglq.friends !== luoluo.friends:\n    " + (minglq.friends !== luoluo.friends),
    "minglq.makeFriendWith === luoluo.makeFriendWith:\n    " + (minglq.makeFriendWith === luoluo.makeFriendWith),
    ____,
    "minglq instanceof Guy:\n    " + (minglq instanceof Guy),
    "luoluo.constructor === Guy:\n    " + (luoluo.constructor === Guy),
    ____,
    "Guy:\n" + Guy.toString()
].join("\n"));


测试结果
{"name":"MingLQ","friends":["Luoluo"]}
{"name":"Luoluo","friends":["MingLQ"]}
--------------------------------
minglq.friends !== luoluo.friends:
    true
minglq.makeFriendWith === luoluo.makeFriendWith:
    true
--------------------------------
minglq instanceof Guy:
    true
luoluo.constructor === Guy:
    true
--------------------------------
Guy:
function (name) {
    this.name = name;
    this.friends = [];
}


详见http://gist.github.com/iwill
0
2
分享到:
评论

相关推荐

    javascript-obfuscatorJS编码器

    javascript-obfuscatorJS编码器

    js-xlsx二次简单封装工具

    因此,对js-xlsx进行二次封装,创建一个简洁易用的工具类,能够降低使用门槛,提高开发效率。这个封装工具通常会提供一些预设的常用功能,如设置默认样式、简化数据转换逻辑等。 **三、封装工具的使用** 1. **初始...

    java-echarts封装

    Java-Echarts封装是一个将流行的JavaScript数据可视化库ECharts与Java后端紧密结合的实践。ECharts是由百度开发的一个基于Canvas的开源图表库,提供丰富的图表类型,包括折线图、柱状图、饼图等,支持大量的自定义...

    javascript----一个Tab的JS

    7. **封装函数**:为了代码的可复用性和维护性,可以将选项卡功能封装成一个函数或类。这样,当需要在其他地方使用时,只需要调用这个函数或实例化这个类即可。 在`tab.htm`文件中,我们可以预期看到HTML结构,以及...

    Javascript经典封装代码

    "JavaScript经典封装代码"集合了开发者们在实践中总结出的一些高效、实用的代码片段,旨在提高开发效率,优化代码结构,增强程序的可读性和可维护性。下面,我们将深入探讨这些经典封装代码背后的原理和应用场景。 ...

    国内外javascript经典封装

    通过学习和运用这些经典的JavaScript封装技术,开发者不仅能提升代码质量,还能跟上技术发展趋势,确保项目在未来的可扩展性和兼容性。同时,理解并熟练掌握封装原则,也是成为一名优秀JavaScript开发者的重要一步。

    javascript--texiao-343.zip_javascript

    9. **ES6新特性**:包括箭头函数、模板字符串、let和const、解构赋值、类等,这些新特性让JavaScript代码更简洁易读,同时提高了开发效率。 10. **jQuery库**:虽然现代JavaScript已经提供了原生API解决大部分需求...

    Javascript Cookie操作类的封装

    接下来,我们来创建一个名为`CookieManager`的JavaScript类,用于封装Cookie的操作。这个类需要包含以下方法: 1. **setCookie**:用于设置Cookie。需要传入键(key)、值(value)以及可选的过期时间(days)和...

    complete-javascript-course-master.zip

    随着课程的深入,将涉及面向对象编程(OOP)的概念,如类、构造函数、继承和封装,这将帮助学员编写更加模块化和可维护的代码。此外,还将涵盖闭包、作用域、原型链等高级特性,这些是JavaScript中的精髓,也是面试...

    Javascript中的封装与继承

    在这个文档中,我们将深入探讨JavaScript中的封装和继承这两个核心概念,帮助你更好地理解和应用这些知识。 封装是面向对象编程的基本原则之一,它涉及到如何组织和保护代码,以实现数据隐藏和功能模块化。在...

    JAVA面向对象基础测试题-继承-封装-多态等测试题.docx

    JAVA面向对象基础测试题-继承-封装-多态等测试题.docx

    angluo-javascript-341240.zip

    JavaScript中的对象、类和原型链,以及构造函数、继承、封装等概念,这些都是理解和实现JavaScript高级特性的关键。此外,JavaScript还有独特的异步处理机制,如回调函数、Promise和async/await,这些都是现代Web...

    Javascript效果封装类(都是国外高手写的)

    JavaScript是一种广泛应用于...它们可以帮助开发者掌握如何使用JavaScript封装功能,提高代码质量,并学习各种前端特效的实现原理。通过深入理解并实践这些示例,可以提升你的前端开发技能,使你在项目中更加游刃有余。

    国内外 JavaScript 经典封装

    1. **面向对象编程(OOP)**:在JavaScript中,面向对象编程主要通过构造函数、原型链和类(ES6引入)来实现。理解如何创建对象、继承和封装是提升代码复用性和可维护性的重要一环。 2. **模块化**:JavaScript的...

    【JavaScript源代码】element-ui封装一个Table模板组件的示例.docx

    element-ui封装一个Table模板组件的示例  大家在做后台管理系统的时候,写的最多的可能就是表格页面了,一般分三部分:搜索功能区、表格内容区和分页器区。一般这些功能都是使用第三方组件库实现,比如说element-ui...

    javascript 消息提示封装文件

    本文将深入探讨“javascript 消息提示封装文件”,了解如何通过前端技术来实现高效、可复用的消息提醒功能。 首先,我们要明白什么是消息提示封装。在JavaScript中,封装意味着将特定的功能或行为打包到一个独立的...

    悟透JavaScript--《JavaScript真经》

    面向对象编程(OOP)是现代编程的主流范式之一,它将数据和代码封装成对象,使得复杂的数据结构和逻辑关系变得更加清晰。在JavaScript中,对象是数据和行为的容器,它们可以包含各种数据类型的属性和函数(方法)。...

    JavaScript----创建可重用代码

    总的来说,通过模块化、函数封装、闭包与高阶函数以及设计模式的应用,JavaScript开发者可以创建出高度可重用的代码,提高开发效率,降低维护成本。在实际项目中,结合具体需求灵活运用这些技术,可以使代码更加健壮...

    Android应用源码之Android调用JavaScript-IT计算机-毕业设计.zip

    - 在Android应用中创建一个类,使用`@JavascriptInterface`注解,然后通过`addJavascriptInterface()`方法将该类实例注入到`WebView`,这样JavaScript就可以调用这个类的方法。 5. **通信方向** - Android到...

    javascript 经典封装

    在这个压缩包中,包含了10个相关的RAR子文件,可能是关于JavaScript封装技术的不同示例或者教程。 1. **对象封装**:在JavaScript中,对象可以用来封装数据和功能。通过创建具有属性和方法的对象,我们可以更好地...

Global site tag (gtag.js) - Google Analytics