1:怎样模拟一个类

在sencha touch2 系列里面定义一个类和new出这个类的对象

Ext.define(
"Animal", {
config: {
name: null
},
constructor: function(config) {
this.initConfig(config);
},
speak: function() {
console.log('说点什么');
}
}
) var my=Ext.create("Animal",{name:"bb"})
my.speak();

上面代码里面constructor在create的时候会自己主动调用。然后初始化config对象配置的属性。

constructor全然就像面对象里面的构造函数……

以下我模拟一下

// 在sencha中new一个对象传了两个參数Ext.create("Animal",{name:"bb"})
// 这里就不模拟sencha的命名空间了,所以生成该类的对象的时候传一个配置对象就可以
// 把命名空间(mss)和命名单独提取出来,new mss.define({});
var mss = {} //建立一个命名空间
mss.define = function(config) {
if(typeof config !== 'object') {
console.log('參数错误');
return;
}
var interface = function() { //当new 该define返回的函数。会自己主动运行atrr和init
this.attr && this.attr();
this.init && this.init.apply(this, arguments);
}
for(var i in config) {
config.hasOwnProperty(i) &&(interface.prototype[i] = config[i]);
}
return interface;
} var Car = mss.define({
attr: function() {
this.type = '汽车';
},
init: function() {
console.log(this.type);
},
speank: function() {
console.log('我是' + this.type);
}
}); var car1 = new Car();
car1.speank();

输出

汽车
我是汽车
[Finished in 0.1s]

这样就模拟成了:define一个类。然后new出来调用其方法;

2:怎样在此基础上继承一个类

首先看看sencha touch2系列的继承

Ext.define(
"Person", {
extend: "Animal",
speak: function() {
console.log('我是人');
}
}
)

加多一个属性extend搞定。

以下在mss.define模拟一下

// 在sencha中new一个对象传了两个參数Ext.create("Animal",{name:"bb"})
// 这里就不模拟sencha的命名空间了。所以生成该类的对象的时候传一个配置对象就可以
// 把命名空间(mss)和命名单独提取出来,new mss.define({});
var _mss = {} //建立一个命名空间
_mss.Define = function(parClass, curConfig) { // 若sup 是个object,表示这是一个新类
// 若sup 是个function,表示这是一个继承
if(typeof parClass === 'object') {
curConfig = parClass;
parClass = function() {};
}
// 定义返回类
// 当new 该define返回的函数。会自己主动运行atrr和init
var interface = function() {
this.attr && this.attr();
this.init && this.init.apply(this, arguments);
}
// 返回类继承 parClass
interface.prototype = new parClass(); // 为返回类包括的两个初始化函数定义基础方法
// 获得继承的init方法 和attr方法
// 假设parClass存在init方法,那么nterface.prototype.init
// 和new parClass().init相等
var parInit = interface.prototype.init || function() {};
var curInit = curConfig.init || function() {};
var parAttr = interface.prototype.attr || function() {};
var curAttr = curConfig.attr || function() {}; // 为返回类原型初始化当前属性,这里注意可能被后面的方法重写
for(var i in curConfig) {
curConfig.hasOwnProperty(i) && (interface.prototype[i] = curConfig[i]);
} // 假设当前返回类已经继承了init,重写该方法
if(arguments.length && arguments[0].prototype && arguments[0].prototype.init === parInit) {
interface.prototype.init = function() {
var scope = this;
var args = [function() {
parInit.apply(scope, arguments);
}];
var slice = [].slice;
curInit.apply(scope, args.concat(slice.call(arguments))); }
} // 假设当前返回类已经继承了attr,重写attr 或者是首次构造改方法(新类)
interface.prototype.attr = function() {
parAttr.call(this);
curAttr.call(this);
} // 继承父类的成员属性
for(var i in parClass) {
parClass.hasOwnProperty(i) && (interface[i] = parClass[i]);
} return interface;
} var Car = _mss.Define({
attr: function() {
this.type = '汽车';
},
init: function() {
console.log(this.type);
},
speank: function() {
console.log('我是' + this.type);
}
}); var car1 = _mss.Define(Car, {
})
new car1().speank();

输出

汽车
我是汽车
[Finished in 0.1s]

对于call实现继承

	interface.prototype.attr = function() {
parAttr.call(this);
curAttr.call(this);
}

在Chorome控制台打印这段代码就能够解释一下这段代码了

var _Attr = function() {
this.a = 1;
}
var B = function() {
this.attr();
};
B.prototype.attr = function(){_Attr.call(this);}
console.log(new B()); VM665:9 B {a: 1}a: 1__proto__: Battr: (){_Attr.call(this);}constructor: () {__proto__: Object

javascript模拟类的最佳实践的更多相关文章

  1. [原创]Javascript模拟“类”的综合实现方式以及部分细节【截至ES6】

    [原创]Javascript模拟“类”的综合实现方式以及部分细节[截至ES6] 前言   最近几个旧项目里使用的图片编辑插件出现Bug, 经Review 后确定需要在其内外均做些改动,但是头疼的发现部 ...

  2. JavaScript best practices JS最佳实践

    JavaScript best practices JS最佳实践 0 简介 最佳实践起初比较棘手,但最终会让你发现这是非常明智之举. 1.合理命名方法及变量名,简洁且可读 var someItem = ...

  3. JavaScript 定义类的最佳写法——完整支持面向对象(封装、继承、多态),兼容所有浏览器,支持用JSDuck生成文档

    作者: zyl910 [TOC] 一.缘由 由于在ES6之前,JavaScript中没有定义类(class)语法.导致大家用各种五花八门的办法来定义类,代码风格不统一.而且对于模拟面向对象的三大支柱& ...

  4. [笔记]《JavaScript高级程序设计》- 最佳实践

    一.可维护性 1 什么是可维护的代码 可理解性--其他人可以接受代码并理解它的意图和一般途径,而无需原开发人员的完整解释. 直观性--代码中的东西一看就能明白,不管其操作过程多么复杂. 可适应性--代 ...

  5. JavaScript的技巧和最佳实践

    JavaScript是一个绝冠全球的编程语言,可用于Web开发.移动应用开发(PhoneGap.Appcelerator).服务器端开发 (Node.js和Wakanda)等等.JavaScript还 ...

  6. JavaScript 最佳实践

    这个文档是基于JavaScript社区众多开发者的意见和经验,在开发JavaScript代码上的最佳实践和首选的方案的明细表.因为这是一个推荐的表而非原则性的方案,经验丰富的开发者可能对下面的表达会有 ...

  7. JavaScript Web 应用最佳实践分析

    [编者按]本文作者为 Mathias Schäfer,旨在回顾在客户端大量使用JavaScript 的最佳 Web应用实践.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 对笔者来说,Jav ...

  8. Javascript定义类(class)的三种方法

    将近20年前,Javascript诞生的时候,只是一种简单的网页脚本语言.如果你忘了填写用户名,它就跳出一个警告. 如今,它变得几乎无所不能,从前端到后端,有着各种匪夷所思的用途.程序员用它完成越来越 ...

  9. [转]Javascript定义类的三种方法

    作者: 阮一峰 原文地址:http://www.ruanyifeng.com/blog/2012/07/three_ways_to_define_a_javascript_class.html 将近2 ...

随机推荐

  1. 一个渣渣python脚本,用wol控制开机

    #!/usr/bin/env python #coding:utf8 import os,time d={} '''f = open('E:\info.txt','r') for ipmac in f ...

  2. 【BZOJ4444】国旗计划 - 决策单调性

    Description A国正在开展一项伟大的计划——国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这项计划需要多名边防战士以接力的形式共同完成,为此,国土安全局已经挑选了N名优秀的边 ...

  3. data structure alignment(数据对齐)

    概述: 数据对齐指数据在计算机内存中排放和获取的方式.包含三个方面:数据对齐(data alignment).数据结构填充(data alignment).打包(packing) 如果数据是自然对齐的 ...

  4. Mysql学习总结(29)——MySQL中CHAR和VARCHAR

    MySQL数据库的字符(串)类不要以为字符类型就是CHAR,CHAR和VARCHAR的区别在于CHAR是固定长度,只要你定义一个字段是CHAR(10),那么不论你存储的数据是否达到了10个字节,它都要 ...

  5. Mysql学习总结(21)——MySQL数据库常见面试题

    1. 如何使用SELECT语句找到你正在运行的服务器的版本并打印出当前数据库的名称? 答:下面的语句的结果会显示服务器的版本和当前的数据库名称 mysql> SELECT VERSION(), ...

  6. 洛谷——P1428 小鱼比可爱

    https://www.luogu.org/problem/show?pid=1428 题目描述 人比人,气死人:鱼比鱼,难死鱼.小鱼最近参加了一个“比可爱”比赛,比的是每只鱼的可爱程度.参赛的鱼被从 ...

  7. Java NIO笔记(一):NIO介绍

    Java NIO即Java Non-blocking IO(Java非堵塞I/O),由于是在Jdk1.4之后添加的一套新的操作I/O工具包,所以通常会被叫做Java New IO.NIO是为提供I/O ...

  8. XUtils3框架的基本用法(一)

    本文为作者原创,转载请指明出处: http://blog.csdn.net/a1002450926/article/details/50341173 今天给大家带来XUtils3的基本介绍.本文章的案 ...

  9. 架构设计--用户端全http參数接口具体说明v1

    1. 用户端全http參数接口具体说明v1.doc 1 2. change histor 1 3. 接口通用參数说明 1 4. 函数注冊接口(规划中) 3 5. 用户权限模块 3 5.1. 用户注冊接 ...

  10. matlab2017a doc 关联注册码

    在 matlab 2017a 的命令行界面,输入doc **查看相关函数的帮助文档时,必须要关联注册码才可使用. 这种显然是在网络连接状况下给出的提示,也即主机处在网络连接状态,试图默认查找的网络中的 ...