js整理5

proto
- 每个对象具有的属性,指向构造该对象的构造函数的原型对象
prototype
- 函数的特有属性,指向原型对象;原型对象可以是对象,数组,函数等类型;
constructor
- 原型对象和实例,都有一个属性
constructor,指回原构造函数 - 修改实例的
constructor不会直接切断和原构造函数联系; - 修改实例的
__proto__.constructor(即原型对象的constructor)会切断生成实例和原构造函数联系;
类风格的代码
//可以构建新构造器函数和原型的轻量级系统
//简单的方式来执行原型继承
//可以访问被函数原型所覆盖的方法的途径
(function () {
var initializing = false,
//测试函数是否能被序列化,判断函数是否包含_super
superPattern = /xyz/.test(function() {xyz;}) ? /\b_super\b/ : /.*/;
Object.subClass = function (properties) {
//上级的prototype
var _super = this.prototype
//初始化超类
//原型实例化时设置为true
initializing = true
var proto = new this()
initializing = false
//将属性复制到prototype里
for (var name in properties) {
//考虑父类的函数
proto[name] = typeof properties[name] == 'function' && typeof _super[name] == 'function' && superPattern.test(properties[name]) ?
(function (name, fn) {
//包装执行子类函数,同时可以通过_super访问父类函数
return function () {
var tmp = this._super
this._super = _super[name]
var ret = fn.apply(this, arguments)
this._super = tmp
return ret
}
})(name, properties[name])
: properties[name]
}
//类构造器
function Class() {
if(!initializing && this.init) {
this.init.apply(this, arguments)
}
}
Class.prototype = proto;
Class.constructor = Class;
Class.subClass = arguments.callee;
return Class
}
})()
//使用
var Person = Object.subClass({
init: function (isDancing) {
this.dancing = isDancing
},
dance: function () {
return this.dancing
}
})
var Ninja = Person.subClass({
init: function () {
this._super(false);
},
dance: function () {
return this._super()
},
swingSword: function () {
return true
}
})
var person = new Person(true)
var ninjia = new Ninja()
js整理5的更多相关文章
- Dynamics CRM 日常使用JS整理(二)
BPF(Business Process Flow)相关的JS 为Stage添加changed或者selected事件: function fnOnLoad() { Xrm.Page.data.pro ...
- Dynamics CRM 日常使用JS整理(一)
整理下平时CRM开发中用到的一些基本的js操作 取值: var oResult = Xrm.Page.getAttribute(sFieldName).getValue(); var oResult ...
- js整理
Js脚本语音 网页里面使用的脚本语音 基础语法 注释语法 单行注释// 多行注释/**/ 嵌入js代码 尽量靠下写 用<script type="text/javascript& ...
- Vue.js 整理笔记
以前我们用Jquery进行dom的操作,虽然熟悉后开发效率很高,但是如果多个控件的相互操作多的情况下,还是会乱.相比之下,Vue的使用更加清晰,通过虚拟dom将数据绑定,而且组件化和路由的帮助下,让整 ...
- js整理3
函数 call: fun.call(a), a会转化成相应的对象,函数内的this即指向它; function foo() { console.log(this); } foo.call(null); ...
- js整理1
数组 比较时的隐式转化 var a = [1,2,3]; var b = [1,2,3]; a == b; //false a == '1,2,3'; //true; // var c = []; B ...
- node.js整理 07例子
需求 一个简单的静态文件合并服务器,该服务器需要支持类似以下格式的JS或CSS文件合并请求. http://assets.example.com/foo/??bar.js,baz.js 在以上URL中 ...
- node.js整理 06异步编程
回调 异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了 function heavyCompute(n, callback) { var count = 0, i, j; for (i = ...
- node.js整理 05进程管理
简介 NodeJS可以感知和控制自身进程的运行环境和状态,也可以创建子进程并与其协同工作,这使得NodeJS可以把多个程序组合在一起共同完成某项工作,并在其中充当胶水和调度器的作用 常用API Pro ...
- node.js整理 03文件操作-遍历目录和文本编码
遍历目录 递归算法 遍历目录时一般使用递归算法,否则就难以编写出简洁的代码. 递归算法与数学归纳法类似,通过不断缩小问题的规模来解决问题 function factorial(n) { if (n = ...
随机推荐
- vtkQuadratic创建半球面
用的关键类:vtkQuadric.vtkSampleFunction.vtkContourFilter:用于创建方框的类vtkOutlineFilter #ifndef INITIAL_OPENGL ...
- JavaScript 智能社 完美运动框架
简约版: function getStyle(obj, name) { if(obj.currentStyle) { return obj.currentStyle[name]; } else { r ...
- Fedora下依赖库的解决
转载于http://blog.sina.com.cn/s/blog_6f74890d0101dpp4.html x86_64版本的fedora中打开共享对象文件失败的解决小技巧———以qq for l ...
- 几个常用的Linux命令
最近在学习Linux,记录了几个命令如下: 首先认识:关机命令,我喜欢用的是:shutdown -h now ,当然还有init 0等命令(用自己习惯的);重启命令:reboot;注销命令:logou ...
- git知识点整理
- windows 上vmare超卡的问题解决方案
http://www.cnblogs.com/jlwen/p/3553722.html
- C语言 活动安排问题之二
有若干个活动,第i个开始时间和结束时间是[Si,fi),活动之间不能交叠,要把活动都安排完,至少需要几个教室? #include <stdio.h> #include <string ...
- c coroutine
今天看了下云风c coroutine 代码 博客,发现 coroutine 实现原理其实还比较简单,就用户态栈切换,只需要几十行汇编,特别轻量级. 具体实现 1. 创建一个coroutine: 也就 ...
- markdown简介
欢迎使用Markdown编辑器写博客 本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接 ...
- [不断更新]iOS开发常用技术
1.修改默认初始化方法 构建便利构造器 修改默认init初始化 .m文件中 @implementation 类名 -(id)init{ self=[super init]; printf(" ...