javascript继承模式,Function模式,对象创建模式

原型继承

//继承
function inherit(obj){
   var F = function(){}
   F.prototype = obj;
   return new F();
}


var parent = {name:'张三', say: function(){console.log(this.name);}}

var child = inherit(parent);

child.say(); //张三

var Person = function(){
    this.name = '张三';
}
Person.prototype.say = function(){
    console.log(this.name);
}

var student = inherit(new Person())

student.say();


//ECMAScript 5提供了上面inherit方法的功能

var child = Object.create({name:'张三', say: function(){console.log(this.name);}});


借用方法

var parent = {
   name: '张三',
   say: function(){

       console.log(this.name);
   }

}

var child = {
    name:'李四'
}

//借用parent的say方法

parent.say.apply(child);  //李四

立即执行函数

//立即执行函数

(function(){console.log(123)}())

(function(){console.log(123)})()


!function(){console.log(123)}();

+function(){console.log(123)}();

-function(){console.log(123)}();

~function(){console.log(123)}();

立即初始化对象

({
    name: '张三那',
    say: function(){
        return this.name;
    },
    init: function(){
        console.log(this.say());

    }


}).init();

命名空间

我们一般这么定义

var app = app || {};
app.moduleA = app.moduleA || {};
app.moduleA.subModule = app.moduleA.subModule || {};
app.moduleA.subModule.MethodA = function () {
    console.log("print A");
};

如果层级很多呢?这样一直下去会很乱

var MYAPP = MYAPP || {};

//定义通用方法
MYAPP.namespace = function (ns_string) {
    var parts = ns_string.split('.'),
        parent = MYAPP,
        i;

    // 默认如果第一个节点是MYAPP的话,就忽略掉,比如MYAPP.ModuleA
    if (parts[0] === "MYAPP") {
        parts = parts.slice(1);
    }

    for (i = 0; i < parts.length; i += 1) {
        // 如果属性不存在,就创建
        if (typeof parent[parts[i]] === "undefined") {
            parent[parts[i]] = {};
        }
        parent = parent[parts[i]];
    }
    return parent;
};


//使用方法

MYAPP.namespace('a.b.c.d.e.f.g.h')


console.log(MYAPP);

定义依赖

有时候你的一个模块或者函数可能要引用第三方的一些模块或者工具,这时候最好将这些依赖模块在刚开始的时候就定义好,以便以后可以很方便地替换掉。

var myFunction = function () {
    // 依赖模块
    var event = YAHOO.util.Event,
        dom = YAHOO.util.dom;

    // 其它函数后面的代码里使用局部变量event和dom
};

隐藏私有方法模式


var myapp  = (function(){
    var name = '张三';
    var sayMyName = function(){

          console.log(name);
    };
    
    return {

       say:sayMyName 
     }

}())

myapp.say();

链模式

链模式可以你连续可以调用一个对象的方法,比如obj.add(1).remove(2).delete(4).add(2)这样的形式,其实现思路非常简单,就是将this原样返回。

var obj = {
    value: 1,
    increment: function () {
        this.value += 1;
        return this;
    },
    add: function (v) {
        this.value += v;
        return this;
    },
    shout: function () {
        console.log(this.value);
    }
};

// 链方法调用
obj.increment().add(3).shout(); // 5

// 也可以单独一个一个调用
obj.increment();
obj.add(3);
obj.shout();

函数语法糖

函数语法糖是为一个对象快速添加方法(函数)的扩展

if(typeof Function.prototype.method !== 'function'){
	Function.prototype.method = function(name, func){
	
		this.prototype[name] = func;
		return this;
	}
	
}


var Person = function(name){
	this.name = name;
}
.method('get', function(){

	return this.name;
})
.method('set', function(value){
	this.name = value;

});

var a = new Person('张三');

console.log(a.get());
console.log(a.set('李四'));
console.log(a.get());

对象的深度克隆。

var man = {
	name:{
		realname: '张三',
		nick:'rick'
	},
	age: 18,
	address:['中国', '美国', '澳大利亚']

}

var clone = function(obj){
	var result, b;
	if((b = (obj instanceof Array)) || obj instanceof Object){
		result = b ? [] : {};
		for(var k in obj){
			result[k] = (obj[k] instanceof Array || obj[k] instanceof Object) ? clone(obj[k]) : obj[k];
		}
	}
	else{
		result = obj;
	}
	return result;

}

var man2 = clone(man);

man2.name.realname = '李四'

console.log(man.name.realname); // 张三

为对象扩展方法:

(function(){
	var xQuery = (function(){
		var xQuery = function(){
		
			return xQuery.fn.init();
		
		};
        //xQuery.fn 为对象定义别名,暂时没用
		xQuery.fn = xQuery.prototype = {
			init: function(){
				return this;
			}
		};
        //xQuery.fn.extend 为方法定义别名,暂时没用
		xQuery.extend = xQuery.fn.extend = function(){
			var options, name, src, copy,
				target = arguments[0] || {},
				i = 1,
				length = arguments.length;

			if(length === i){
				target = this;
				--i;  //不执行后面循环
			}

			for(; i < length; i++){
				if((options = arguments[i]) != null){
					for(name in options){
						src = target[name];
						copy = options[name];
						
						if( src === copy ){
							continue;
						}

						if( copy !== undefined ){
							
							target[name] = copy;
						
						}
					
					}
				
				}
			
			}

			return target;
		
		}

		return xQuery;
	}());

	window.xQuery = window.$ = xQuery();

}());

$.ui = $.ui || {};

$.extend($.ui, {name: 'php', getName: function(){ return this.name;}});

console.log($.ui.getName());

 

转载于:https://my.oschina.net/shyl/blog/681478

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值