JS组件开发
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JS组件开发2</title>
</head>
<body>
<input type="text" id="J_input"/>
</body>
<script src="jQuery/1.9.1/jquery.min.js"></script>
<script>
var TextCount = (function(){
//私有方法,外面将访问不到
var _bind = function(that){
that.input.on('keyup',function(){
that.render();
});
};
var _getNum =function(that){
return that.input.val().length;
};
var TextCountFun = function(config){
};
TextCountFun.prototype.init = function(config){
this.input = $(config.id);
_bind(this);
return this;
};
TextCountFun.prototype.render = function(){
var num = _getNum(this);
if ($('#J_input_count').length == 0) {
this.input.after('<span id="J_input_count"></span>');
};
$('#J_input_count').html(num+'个字');
};
//返回构造函数
return TextCountFun;
})();
$(function(){
new TextCount().init({id:'#J_input'}).render();
});
</script>
看了一篇关于写JS组件开发的博客,居然看不懂,虽然我前几天觉得自己把原型那块弄的非常懂,但是看到上面实际应用的代码时,还是一脸懵逼,不知道如何下面的调用这个组件的方式为何是这样,我就写了下面的一个小例子:而且呢,
你一定要搞清楚this的指向问题,在这里this都是指向构造函数TextCountFun.
$(function(){ new TextCount().init({id:'#J_input'}).render(); });
为啥这样调用:首先,匿名函数自执行--返回了构造函数了TextCountFun--1,所以TextCount 等同于构造函数TextCountFun,
2,new TextCount()相当于实例化了TextCountFun,
3,new TextCount().init({id:'#J_input'}),就是调用了TextCountFun原型里的方法,init并且传了参数, init方法又返回了this---又因为this指向了TextCountFun,所以实现了链式调用render.
附上我自己动手分析的一个小例子:当你弄不明白的时候,动手写个小小的demo一步步分析,你就会懂了....
<script>
var a = (function(){
var _eat = function(that){
alert(this) ;//这里的this 指向window
alert(that.food); //所以把指向构造函数的this传值给_eat,让_eat可以调用Person里的属性。
};
function Person(info){
this.name = info.name;
this.age = info.age;
this.food = info.food;
}
//共有方法
Person.prototype.say = function(info){
_eat(this); //这里的this指向构造函数Person
return this.name+this.age;
};
return Person;
})();
//构造函数
var b = new a({name:'zhu',age:'20',food:'apple'});
alert(b.say());
</script>
并且附上以上组件来源的博客地址:javascript组件开发
顺便奉上几篇关于js插件编写规则的文章
如何定义一个高逼格的原生JS插件
从jq插件到js组件封装

浙公网安备 33010602011771号