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(" ... 
