zoukankan      html  css  js  c++  java
  • js整理5

    proto

    • 每个对象具有的属性,指向构造该对象的构造函数的原型对象

    prototype

    • 函数的特有属性,指向原型对象;原型对象可以是对象,数组,函数等类型;

    constructor

    • 原型对象和实例,都有一个属性constructor,指回原构造函数
    • 修改实例的constructor不会直接切断和原构造函数联系;
    • 修改实例的__proto__.constructor(即原型对象的constructor)会切断生成实例和原构造函数联系;

    类风格的代码

    //可以构建新构造器函数和原型的轻量级系统
    //简单的方式来执行原型继承
    //可以访问被函数原型所覆盖的方法的途径
    
    (function () {
    	var initializing = false,
    	    //测试函数是否能被序列化,判断函数是否包含_super
    		superPattern = /xyz/.test(function() {xyz;}) ? /_super/ : /.*/;
    
    	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()
    
  • 相关阅读:
    设置vim查找高亮
    设置vim显示行号
    虚拟机安装VMware tools
    硬链接和软链接
    Ubuntu用户首次设置root用户的密码
    Ubuntu无法远程连接
    线上教育课堂如何解决H5视频点播转码出现的黑屏问题?
    “音视频+”时代到来,HLS(m3u8)/HTTP-FLV/RTSP流媒体RTMP推流服务器EasyDSS应用场景优化
    搭建一套完整的网络视频流媒体直播/点播服务系统需要具备哪些条件?
    关于网络视频流媒体直播/点播服务流程,你要知道的全在这里了!(新手必看)
  • 原文地址:https://www.cnblogs.com/jinkspeng/p/6034711.html
Copyright © 2011-2022 走看看