Technicalarticles
function CreatePerson(name,age,sex) {
var obj = new Object();
obj.name = name;
obj.age = age;
obj.sex = sex;
obj.sayName = function(){
return this.name;
}
return obj;
}
var p1 = new CreatePerson("longen",'28','男');
var p2 = new CreatePerson("tugenhua",'27','女');
console.log(p1.name); // longen
console.log(p1.age); // 28
console.log(p1.sex); // 男
console.log(p1.sayName()); // longen
console.log(p2.name); // tugenhua
console.log(p2.age); // 27
console.log(p2.sex); // 女
console.log(p2.sayName()); // tugenhua
// 返回都是object 无法识别对象的类型 不知道他们是哪个对象的实列
console.log(typeof p1); // object
console.log(typeof p2); // object
console.log(p1 instanceof Object); // true
// 定义自行车的构造函数
var BicycleShop = function(){};
BicycleShop.prototype = {
constructor: BicycleShop,
/*
* 买自行车这个方法
* @param {model} 自行车型号
*/
sellBicycle: function(model){
var bicycle = this.createBicycle(mode);
// 执行A业务逻辑
bicycle.A();
// 执行B业务逻辑
bicycle.B();
return bicycle;
},
createBicycle: function(model){
throw new Error("父类是抽象类不能直接调用,需要子类重写该方法");
}
};
// 定义自行车的构造函数
var BicycleShop = function(name){
this.name = name;
this.method = function(){
return this.name;
}
};
BicycleShop.prototype = {
constructor: BicycleShop,
/*
* 买自行车这个方法
* @param {model} 自行车型号
*/
sellBicycle: function(model){
var bicycle = this.createBicycle(model);
// 执行A业务逻辑
bicycle.A();
// 执行B业务逻辑
bicycle.B();
return bicycle;
},
createBicycle: function(model){
throw new Error("父类是抽象类不能直接调用,需要子类重写该方法");
}
};
// 实现原型继承
function extend(Sub,Sup) {
//Sub表示子类,Sup表示超类
// 首先定义一个空函数
var F = function(){};
// 设置空函数的原型为超类的原型
F.prototype = Sup.prototype;
// 实例化空函数,并把超类原型引用传递给子类
Sub.prototype = new F();
// 重置子类原型的构造器为子类自身
Sub.prototype.constructor = Sub;
// 在子类中保存超类的原型,避免子类与超类耦合
Sub.sup = Sup.prototype;
if(Sup.prototype.constructor === Object.prototype.constructor) {
// 检测超类原型的构造器是否为原型自身
Sup.prototype.constructor = Sup;
}
}
var BicycleChild = function(name){
this.name = name;
// 继承构造函数父类中的属性和方法
BicycleShop.call(this,name);
};
// 子类继承父类原型方法
extend(BicycleChild,BicycleShop);
// BicycleChild 子类重写父类的方法
BicycleChild.prototype.createBicycle = function(){
var A = function(){
console.log("执行A业务操作");
};
var B = function(){
console.log("执行B业务操作");
};
return {
A: A,
B: B
}
}
var childClass = new BicycleChild("龙恩");
console.log(childClass);
console.log(childClass.name); // 龙恩// 下面是实例化后 执行父类中的sellBicycle这个方法后会依次调用父类中的A// 和B方法;A方法和 B方法依次在子类中去编写具体的业务逻辑。childClass.sellBicycle("mode"); // 打印出 执行A业务操作和执行 B业务操作
可以用来划分命名空间,减少全局变量的数量。
使用单体模式可以使代码组织的更为一致,使代码容易阅读和维护。
可以被实例化,且实例化一次。
// 对象字面量var Singleton = { attr1: 1, attr2: 2, method1: function(){ return this.attr1; }, method2: function(){ return this.attr2; }};
// 单体模式var Singleton = function(name){ this.name = name; this.instance = null;};Singleton.prototype.getName = function(){ return this.name;}// 获取实例对象function getInstance(name) { if(!this.instance) { this.instance = new Singleton(name); } return this.instance;}// 测试单体模式的实例var a = getInstance("aa");var b = getInstance("bb");
console.log(a === b); // true
console.log(a.getName());// aaconsole.log(b.getName());// aa
// 单体模式var Singleton = function(name){ this.name = name;};Singleton.prototype.getName = function(){ return this.name;}// 获取实例对象var getInstance = (function() { var instance = null; return function(name) { if(!instance) { instance = new Singleton(name); } return instance; }})();// 测试单体模式的实例var a = getInstance("aa");var b = getInstance("bb");
// 单体模式var CreateDiv = function(html) { this.html = html; this.init();}CreateDiv.prototype.init = function(){ var div = document.createElement("div"); div.innerHTML = this.html; document.body.appendChild(div);};// 代理实现单体模式var ProxyMode = (function(){ var instance; return function(html) { if(!instance) { instance = new CreateDiv("我来测试下"); } return instance; } })();var a = new ProxyMode("aaa");var b = new ProxyMode("bbb");console.log(a===b);// true
// 实现弹窗var createWindow = function(){ var div = document.createElement("div"); div.innerHTML = "我是弹窗内容"; div.style.display = 'none'; document.body.appendChild('div'); return div;};document.getElementById("Id").onclick = function(){ // 点击后先创建一个div元素 var win = createWindow(); win.style.display = "block";}
// 实现单体模式弹窗var createWindow = (function(){ var div; return function(){ if(!div) { div = document.createElement("div"); div.innerHTML = "我是弹窗内容"; div.style.display = 'none'; document.body.appendChild(div); } return div; }})();document.getElementById("Id").onclick = function(){ // 点击后先创建一个div元素 var win = createWindow(); win.style.display = "block";}
var createIframe = (function(){ var iframe; return function(){ if(!iframe) { iframe = document.createElement("iframe"); iframe.style.display = 'none'; document.body.appendChild(iframe); } return iframe; };})();
var getInstance = function(fn) { var result; return function(){ return result || (result = fn.call(this,arguments)); }};
// 创建divvar createWindow = function(){ var div = document.createElement("div"); div.innerHTML = "我是弹窗内容"; div.style.display = 'none'; document.body.appendChild(div); return div;};// 创建iframevar createIframe = function(){ var iframe = document.createElement("iframe"); document.body.appendChild(iframe); return iframe;};// 获取实例的封装代码var getInstance = function(fn) { var result; return function(){ return result || (result = fn.call(this,arguments)); }};// 测试创建divvar createSingleDiv = getInstance(createWindow);document.getElementById("Id").onclick = function(){ var win = createSingleDiv(); win.style.display = "block";};// 测试创建iframevar createSingleIframe = getInstance(createIframe);document.getElementById("Id").onclick = function(){ var win = createSingleIframe(); win.src = "http://cnblogs.com";};
var singleMode = { name: value, method: function(){ }};
var singleMode = (function(){ // 创建私有变量 var privateNum = 112; // 创建私有函数 function privateFunc(){ // 实现自己的业务逻辑代码 } // 返回一个对象包含公有方法和属性 return { publicMethod1: publicMethod1, publicMethod2: publicMethod1 };})();
function CustomType() {
this.name = "tugenhua";
};
CustomType.prototype.getName = function(){
return this.name;
}
var application = (function(){
// 定义私有
var privateA = "aa";
// 定义私有函数
function A(){};
// 实例化一个对象后,返回该实例,然后为该实例增加一些公有属性和方法
var object = new CustomType();
// 添加公有属性
object.A = "aa";
// 添加公有方法
object.B = function(){
return privateA;
}
// 返回该对象
return object;
})();
代理对象可以代替本体被实例化,并使其可以被远程访问;
它还可以把本体实例化推迟到真正需要的时候;对于实例化比较费时的本体对象,或者因为尺寸比较大以至于不用时不适于保存在内存中的本体,我们可以推迟实例化该对象;
// 先申明一个奶茶妹对象var TeaAndMilkGirl = function(name) { this.name = name;};// 这是京东ceo先生var Ceo = function(girl) { this.girl = girl; // 送结婚礼物 给奶茶妹 this.sendMarriageRing = function(ring) { console.log("Hi " + this.girl.name + ", ceo送你一个礼物:" + ring); }};// 京东ceo的经纪人是代理,来代替送var ProxyObj = function(girl){ this.girl = girl; // 经纪人代理送礼物给奶茶妹 this.sendGift = function(gift) { // 代理模式负责本体对象实例化 (new Ceo(this.girl)).sendMarriageRing(gift); }};// 初始化var proxy = new ProxyObj(new TeaAndMilkGirl("奶茶妹"));proxy.sendGift("结婚戒"); // Hi 奶茶妹, ceo送你一个礼物:结婚戒
// 不使用代理的预加载图片函数如下var myImage = (function(){ var imgNode = document.createElement("img"); document.body.appendChild(imgNode); var img = new Image(); img.onload = function(){ imgNode.src = this.src; }; return { setSrc: function(src) { imgNode.src = "http://img.lanrentuku.com/img/allimg/1212/5-121204193Q9-50.gif"; img.src = src; } }})();// 调用方式myImage.setSrc("https://img.alicdn.com/tps/i4/TB1b_neLXXXXXcoXFXXc8PZ9XXX-130-200.png");
var myImage = (function(){ var imgNode = document.createElement("img"); document.body.appendChild(imgNode); return { setSrc: function(src) { imgNode.src = src; } }})();// 代理模式var ProxyImage = (function(){ var img = new Image(); img.onload = function(){ myImage.setSrc(this.src); }; return { setSrc: function(src) { myImage.setSrc("http://img.lanrentuku.com/img/allimg/1212/5-121204193Q9-50.gif"); img.src = src; } }})();// 调用方式ProxyImage.setSrc("https://img.alicdn.com/tps/i4/TB1b_neLXXXXXcoXFXXc8PZ9XXX-130-200.png");
var myImage = (function(){ var imgNode = document.createElement("img"); document.body.appendChild(imgNode); return function(src){ imgNode.src = src; }})();// 代理模式var ProxyImage = (function(){ var img = new Image(); img.onload = function(){ myImage(this.src); }; return function(src) { myImage("http://img.lanrentuku.com/img/allimg/1212/5-121204193Q9-50.gif"); img.src = src; }})();// 调用方式ProxyImage("https://img.alicdn.com/tps/i4/TB1b_neLXXXXXcoXFXXc8PZ9XXX-130-200.png");
// 首先html结构如下:<p> <label>选择框</label> <input type="checkbox" class="j-input" data-id="1"/></p><p> <label>选择框</label> <input type="checkbox" class="j-input" data-id = "2"/></p><p> <label>选择框</label> <input type="checkbox" class="j-input" data-id="3"/></p><p> <label>选择框</label> <input type="checkbox" class="j-input" data-id = "4"/></p>
<script> var checkboxs = document.getElementsByClassName("j-input"); for(var i = 0,ilen = checkboxs.length; i < ilen; i+=1) { (function(i){ checkboxs[i].onclick = function(){ if(this.checked) { var id = this.getAttribute("data-id"); // 如下是ajax请求 } } })(i); }</script>
// 本体函数var mainFunc = function(ids) { console.log(ids); // 即可打印被选中的所有的id // 再把所有的id一次性发ajax请求给服务器端};// 代理函数 通过代理函数获取所有的id 传给本体函数去执行var proxyFunc = (function(){ var cache = [], // 保存一段时间内的id timer = null; // 定时器 return function(checkboxs) { // 判断如果定时器有的话,不进行覆盖操作 if(timer) { return; } timer = setTimeout(function(){ // 在2秒内获取所有被选中的id,通过属性isflag判断是否被选中 for(var i = 0,ilen = checkboxs.length; i < ilen; i++) { if(checkboxs[i].hasAttribute("isflag")) { var id = checkboxs[i].getAttribute("data-id"); cache[cache.length] = id; } } mainFunc(cache.join(',')); // 2秒后需要给本体函数传递所有的id // 清空定时器 clearTimeout(timer); timer = null; cache = []; },2000); }})();var checkboxs = document.getElementsByClassName("j-input");for(var i = 0,ilen = checkboxs.length; i < ilen; i+=1) { (function(i){ checkboxs[i].onclick = function(){ if(this.checked) { // 给当前增加一个属性 this.setAttribute("isflag",1); }else { this.removeAttribute('isflag'); } // 调用代理函数 proxyFunc(checkboxs); } })(i);}
// 计算乘法
var mult = function(){
var a = 1;
for(var i = 0,ilen = arguments.length; i < ilen; i+=1) {
a = a*arguments[i];
}
return a;
};
// 计算加法
var plus = function(){
var a = 0;
for(var i = 0,ilen = arguments.length; i < ilen; i+=1) {
a += arguments[i];
}
return a;
}
// 代理函数
var proxyFunc = function(fn) {
var cache = {}; // 缓存对象
return function(){
var args = Array.prototype.join.call(arguments,',');
if(args in cache) {
return cache[args]; // 使用缓存代理
}
return cache[args] = fn.apply(this,arguments);
}
};
var proxyMult = proxyFunc(mult);
console.log(proxyMult(1,2,3,4)); // 24
console.log(proxyMult(1,2,3,4)); // 缓存取 24
var proxyPlus = proxyFunc(plus);
console.log(proxyPlus(1,2,3,4)); // 10
console.log(proxyPlus(1,2,3,4)); // 缓存取 10
// 我们一般写代码如下处理操作var order = function(orderType,isPay,count) { if(orderType == 1) { // 用户充值500元到支付宝去 if(isPay == true) { // 如果充值成功的话,100%中奖 console.log("亲爱的用户,您中奖了100元红包了"); }else { // 充值失败,就当作普通用户来处理中奖信息 if(count > 0) { console.log("亲爱的用户,您已抽到10元优惠卷"); }else { console.log("亲爱的用户,请再接再厉哦"); } } }else if(orderType == 2) { // 用户充值200元到支付宝去 if(isPay == true) { // 如果充值成功的话,100%中奖 console.log("亲爱的用户,您中奖了20元红包了"); }else { // 充值失败,就当作普通用户来处理中奖信息 if(count > 0) { console.log("亲爱的用户,您已抽到10元优惠卷"); }else { console.log("亲爱的用户,请再接再厉哦"); } } }else if(orderType == 3) { // 普通用户来处理中奖信息 if(count > 0) { console.log("亲爱的用户,您已抽到10元优惠卷"); }else { console.log("亲爱的用户,请再接再厉哦"); } }};
function order500(orderType,isPay,count){ if(orderType == 1 && isPay == true) { console.log("亲爱的用户,您中奖了100元红包了"); }else { // 自己不处理,传递给下一个对象order200去处理 order200(orderType,isPay,count); }};function order200(orderType,isPay,count) { if(orderType == 2 && isPay == true) { console.log("亲爱的用户,您中奖了20元红包了"); }else { // 自己不处理,传递给下一个对象普通用户去处理 orderNormal(orderType,isPay,count); }};function orderNormal(orderType,isPay,count){ // 普通用户来处理中奖信息 if(count > 0) { console.log("亲爱的用户,您已抽到10元优惠卷"); }else { console.log("亲爱的用户,请再接再厉哦"); }}
function order500(orderType,isPay,count){
if(orderType == 1 && isPay == true) {
console.log("亲爱的用户,您中奖了100元红包了");
}else {
//我不知道下一个节点是谁,反正把请求往后面传递
return "nextSuccessor";
}
};
function order200(orderType,isPay,count) {
if(orderType == 2 && isPay == true) {
console.log("亲爱的用户,您中奖了20元红包了");
}else {
//我不知道下一个节点是谁,反正把请求往后面传递
return "nextSuccessor";
}
};
function orderNormal(orderType,isPay,count){
// 普通用户来处理中奖信息
if(count > 0) {
console.log("亲爱的用户,您已抽到10元优惠卷");
}else {
console.log("亲爱的用户,请再接再厉哦");
}
}
// 下面需要编写职责链模式的封装构造函数方法
var Chain = function(fn){
this.fn = fn;
this.successor = null;
};
Chain.prototype.setNextSuccessor = function(successor){
return this.successor = successor;
}
// 把请求往下传递
Chain.prototype.passRequest = function(){
var ret = this.fn.apply(this,arguments);
if(ret === 'nextSuccessor') {
return this.successor && this.successor.passRequest.apply(this.successor,arguments);
}
return ret;
}
//现在我们把3个函数分别包装成职责链节点:
var chainOrder500 = new Chain(order500);
var chainOrder200 = new Chain(order200);
var chainOrderNormal = new Chain(orderNormal);
// 然后指定节点在职责链中的顺序
chainOrder500.setNextSuccessor(chainOrder200);
chainOrder200.setNextSuccessor(chainOrderNormal);
//最后把请求传递给第一个节点:
chainOrder500.passRequest(1,true,500); // 亲爱的用户,您中奖了100元红包了
chainOrder500.passRequest(2,true,500); // 亲爱的用户,您中奖了20元红包了
chainOrder500.passRequest(3,true,500); // 亲爱的用户,您已抽到10元优惠卷
chainOrder500.passRequest(1,false,0); // 亲爱的用户,请再接再厉哦
function Fn1() {
console.log(1);
return "nextSuccessor";
}
function Fn2() {
console.log(2);
var self = this;
setTimeout(function(){
self.next();
},1000);
}
function Fn3() {
console.log(3);
}
// 下面需要编写职责链模式的封装构造函数方法
var Chain = function(fn){
this.fn = fn;
this.successor = null;
};
Chain.prototype.setNextSuccessor = function(successor){
return this.successor = successor;
}
// 把请求往下传递
Chain.prototype.passRequest = function(){
var ret = this.fn.apply(this,arguments);
if(ret === 'nextSuccessor') {
return this.successor && this.successor.passRequest.apply(this.successor,arguments);
}
return ret;
}
Chain.prototype.next = function(){
return this.successor && this.successor.passRequest.apply(this.successor,arguments);
}
//现在我们把3个函数分别包装成职责链节点:
var chainFn1 = new Chain(Fn1);
var chainFn2 = new Chain(Fn2);
var chainFn3 = new Chain(Fn3);
// 然后指定节点在职责链中的顺序
chainFn1.setNextSuccessor(chainFn2);
chainFn2.setNextSuccessor(chainFn3);
chainFn1.passRequest(); // 打印出1,2 过1秒后 会打印出3
假设html结构如下:<button id="button1">刷新菜单目录</button><button id="button2">增加子菜单</button><button id="button3">删除子菜单</button>
var b1 = document.getElementById("button1"), b2 = document.getElementById("button2"), b3 = document.getElementById("button3"); // 定义setCommand 函数,该函数负责往按钮上面安装命令。点击按钮后会执行command对象的execute()方法。 var setCommand = function(button,command){ button.onclick = function(){ command.execute(); } }; // 下面我们自己来定义各个对象来完成自己的业务操作 var MenuBar = { refersh: function(){ alert("刷新菜单目录"); } }; var SubMenu = { add: function(){ alert("增加子菜单"); }, del: function(){ alert("删除子菜单"); } }; // 下面是编写命令类 var RefreshMenuBarCommand = function(receiver){ this.receiver = receiver; }; RefreshMenuBarCommand.prototype.execute = function(){ this.receiver.refersh(); } // 增加命令操作 var AddSubMenuCommand = function(receiver) { this.receiver = receiver; }; AddSubMenuCommand.prototype.execute = function() { this.receiver.add(); } // 删除命令操作 var DelSubMenuCommand = function(receiver) { this.receiver = receiver; }; DelSubMenuCommand.prototype.execute = function(){ this.receiver.del(); } // 最后把命令接收者传入到command对象中,并且把command对象安装到button上面 var refershBtn = new RefreshMenuBarCommand(MenuBar); var addBtn = new AddSubMenuCommand(SubMenu); var delBtn = new DelSubMenuCommand(SubMenu); setCommand(b1,refershBtn); setCommand(b2,addBtn); setCommand(b3,delBtn);
var setCommand = function(button,func) { button.onclick = function(){ func(); } }; var MenuBar = { refersh: function(){ alert("刷新菜单界面"); } }; var SubMenu = { add: function(){ alert("增加菜单"); } }; // 刷新菜单 var RefreshMenuBarCommand = function(receiver) { return function(){ receiver.refersh(); }; }; // 增加菜单 var AddSubMenuCommand = function(receiver) { return function(){ receiver.add(); }; }; var refershMenuBarCommand = RefreshMenuBarCommand(MenuBar); // 增加菜单 var addSubMenuCommand = AddSubMenuCommand(SubMenu); setCommand(b1,refershMenuBarCommand); setCommand(b2,addSubMenuCommand);
// 如下代码上的四个按钮 点击事件var b1 = document.getElementById("button1"), b2 = document.getElementById("button2"), b3 = document.getElementById("button3"), b4 = document.getElementById("button4");/* bindEnv函数负责往按钮上面安装点击命令。点击按钮后,会调用 函数 */var bindEnv = function(button,func) { button.onclick = function(){ func(); }};// 现在我们来编写具体处理业务逻辑代码var Todo1 = { test1: function(){ alert("我是来做第一个测试的"); }};// 实现业务中的增删改操作var Menu = { add: function(){ alert("我是来处理一些增加操作的"); }, del: function(){ alert("我是来处理一些删除操作的"); }, update: function(){ alert("我是来处理一些更新操作的"); }};// 调用函数bindEnv(b1,Todo1.test1);// 增加按钮bindEnv(b2,Menu.add);// 删除按钮bindEnv(b3,Menu.del);// 更改按钮bindEnv(b4,Menu.update);
var command1 = { execute: function(){ console.log(1); }};var command2 = { execute: function(){ console.log(2); }};var command3 = { execute: function(){ console.log(3); }};// 定义宏命令,command.add方法把子命令添加进宏命令对象,// 当调用宏命令对象的execute方法时,会迭代这一组命令对象,// 并且依次执行他们的execute方法。var command = function(){ return { commandsList: [], add: function(command){ this.commandsList.push(command); }, execute: function(){ for(var i = 0,commands = this.commandsList.length; i < commands; i+=1) { this.commandsList[i].execute(); } } }};// 初始化宏命令var c = command();c.add(command1);c.add(command2);c.add(command3);c.execute(); // 1,2,3
var BaiDuInterview = function(){};
// baidu 笔试BaiDuInterview.prototype.writtenTest = function(){ console.log("我终于看到百度的笔试题了~");};
// 技术面试
BaiDuInterview.prototype.technicalInterview = function(){
console.log("我是百度的技术负责人");
};
// 领导面试
BaiDuInterview.prototype.leader = function(){
console.log("百度leader来面试了");
};
// 等通知
BaiDuInterview.prototype.waitNotice = function(){
console.log("百度的人力资源太不给力了,到现在都不给我通知");
};
如上看到代码的基本结构,但是我们还需要一个初始化方法;代码如下:
// 代码初始化
BaiDuInterview.prototype.init = function(){
this.writtenTest();
this.technicalInterview();
this.leader();
this.waitNotice();
};
var baiDuInterview = new BaiDuInterview();
baiDuInterview.init();
综合所述:所有的代码如下:
var BaiDuInterview = function(){};
// baidu 笔试
BaiDuInterview.prototype.writtenTest = function(){
console.log("我终于看到百度的题目笔试题了~");
};
// 技术面试
BaiDuInterview.prototype.technicalInterview = function(){
console.log("我是百度的技术负责人");
};
// 领导面试
BaiDuInterview.prototype.leader = function(){
console.log("百度leader来面试了");
};
// 等通知
BaiDuInterview.prototype.waitNotice = function(){
console.log("百度的人力资源太不给力了,到现在都不给我通知");
};
// 代码初始化
BaiDuInterview.prototype.init = function(){
this.writtenTest();
this.technicalInterview();
this.leader();
this.waitNotice();
};
var baiDuInterview = new BaiDuInterview();
baiDuInterview.init();
var Interview = function(){};
// 笔试Interview.prototype.writtenTest = function(){ console.log("我终于看到笔试题了~");};
// 技术面试Interview.prototype.technicalInterview = function(){ console.log("我是技术负责人负责技术面试");};
// 领导面试Interview.prototype.leader = function(){ console.log("leader来面试了");};
// 等通知Interview.prototype.waitNotice = function(){ console.log("人力资源太不给力了,到现在都不给我通知");};
// 代码初始化Interview.prototype.init = function(){ this.writtenTest(); this.technicalInterview(); this.leader(); this.waitNotice();};
var BaiDuInterview = function(){};BaiDuInterview.prototype = new Interview();
// 子类重写方法 实现自己的业务逻辑
BaiDuInterview.prototype.writtenTest = function(){
console.log("我终于看到百度的笔试题了");
}
BaiDuInterview.prototype.technicalInterview = function(){
console.log("我是百度的技术负责人,想面试找我");
}
BaiDuInterview.prototype.leader = function(){
console.log("我是百度的leader,不想加班的或者业绩提不上去的给我滚蛋");
}
BaiDuInterview.prototype.waitNotice = function(){
console.log("百度的人力资源太不给力了,我等的花儿都谢了!!");
}
var baiDuInterview = new BaiDuInterview();
baiDuInterview.init();
var calculateBouns = function(salary,level) { if(level === 'A') { return salary * 4; } if(level === 'B') { return salary * 3; } if(level === 'C') { return salary * 2; }};// 调用如下:console.log(calculateBouns(4000,'A')); // 16000console.log(calculateBouns(2500,'B')); // 7500
var performanceA = function(salary) { return salary * 4;};var performanceB = function(salary) { return salary * 3;}; var performanceC = function(salary) { return salary * 2};var calculateBouns = function(level,salary) { if(level === 'A') { return performanceA(salary); } if(level === 'B') { return performanceB(salary); } if(level === 'C') { return performanceC(salary); }};// 调用如下console.log(calculateBouns('A',4500)); // 18000
var performanceA = function(){};performanceA.prototype.calculate = function(salary) { return salary * 4;};var performanceB = function(){};performanceB.prototype.calculate = function(salary) { return salary * 3;};var performanceC = function(){};performanceC.prototype.calculate = function(salary) { return salary * 2;};// 奖金类var Bouns = function(){ this.salary = null; // 原始工资 this.levelObj = null; // 绩效等级对应的策略对象};Bouns.prototype.setSalary = function(salary) { this.salary = salary; // 保存员工的原始工资};Bouns.prototype.setlevelObj = function(levelObj){ this.levelObj = levelObj; // 设置员工绩效等级对应的策略对象};// 取得奖金数Bouns.prototype.getBouns = function(){ // 把计算奖金的操作委托给对应的策略对象 return this.levelObj.calculate(this.salary);};var bouns = new Bouns();bouns.setSalary(10000);bouns.setlevelObj(new performanceA()); // 设置策略对象console.log(bouns.getBouns()); // 40000 bouns.setlevelObj(new performanceB()); // 设置策略对象console.log(bouns.getBouns()); // 30000
//代码如下:var obj = { "A": function(salary) { return salary * 4; }, "B" : function(salary) { return salary * 3; }, "C" : function(salary) { return salary * 2; }};var calculateBouns =function(level,salary) { return obj[level](salary);};console.log(calculateBouns('A',10000)); // 40000
<form action = "http://www.baidu.com" id="registerForm" method = "post"> <p> <label>请输入用户名:</label> <input type="text" name="userName"/> </p> <p> <label>请输入密码:</label> <input type="text" name="password"/> </p> <p> <label>请输入手机号码:</label> <input type="text" name="phoneNumber"/> </p></form>
var registerForm = document.getElementById("registerForm");registerForm.onsubmit = function(){ if(registerForm.userName.value === '') { alert('用户名不能为空'); return; } if(registerForm.password.value.length < 6) { alert("密码的长度不能小于6位"); return; } if(!/(^1[3|5|8][0-9]{9}$)/.test(registerForm.phoneNumber.value)) { alert("手机号码格式不正确"); return; }}
var strategy = { isNotEmpty: function(value,errorMsg) { if(value === '') { return errorMsg; } }, // 限制最小长度 minLength: function(value,length,errorMsg) { if(value.length < length) { return errorMsg; } }, // 手机号码格式 mobileFormat: function(value,errorMsg) { if(!/(^1[3|5|8][0-9]{9}$)/.test(value)) { return errorMsg; } }};
var Validator = function(){ this.cache = []; // 保存效验规则};Validator.prototype.add = function(dom,rule,errorMsg) { var str = rule.split(":"); this.cache.push(function(){ // str 返回的是 minLength:6 var strategy = str.shift(); str.unshift(dom.value); // 把input的value添加进参数列表 str.push(errorMsg); // 把errorMsg添加进参数列表 return strategys[strategy].apply(dom,str); });};Validator.prototype.start = function(){ for(var i = 0, validatorFunc; validatorFunc = this.cache[i++]; ) { var msg = validatorFunc(); // 开始效验 并取得效验后的返回信息 if(msg) { return msg; } }};
var validateFunc = function(){
var validator = new Validator(); // 创建一个Validator对象
/* 添加一些效验规则 */
validator.add(registerForm.userName,'isNotEmpty','用户名不能为空');
validator.add(registerForm.password,'minLength:6','密码长度不能小于6位');
validator.add(registerForm.userName,'mobileFormat','手机号码格式不正确');
var errorMsg = validator.start(); // 获得效验结果
return errorMsg; // 返回效验结果
};
var registerForm = document.getElementById("registerForm");
registerForm.onsubmit = function(){
var errorMsg = validateFunc();
if(errorMsg){
alert(errorMsg);
return false;
}
}
var strategys = {
isNotEmpty: function(value,errorMsg) {
if(value === '') {
return errorMsg;
}
},
// 限制最小长度
minLength: function(value,length,errorMsg) {
if(value.length < length) {
return errorMsg;
}
},
// 手机号码格式
mobileFormat: function(value,errorMsg) {
if(!/(^1[3|5|8][0-9]{9}$)/.test(value)) {
return errorMsg;
}
}
};
var Validator = function(){
this.cache = []; // 保存效验规则
};
Validator.prototype.add = function(dom,rule,errorMsg) {
var str = rule.split(":");
this.cache.push(function(){
// str 返回的是 minLength:6
var strategy = str.shift();
str.unshift(dom.value); // 把input的value添加进参数列表
str.push(errorMsg); // 把errorMsg添加进参数列表
return strategys[strategy].apply(dom,str);
});
};
Validator.prototype.start = function(){
for(var i = 0, validatorFunc; validatorFunc = this.cache[i++]; ) {
var msg = validatorFunc(); // 开始效验 并取得效验后的返回信息
if(msg) {
return msg;
}
}
};
var validateFunc = function(){
var validator = new Validator(); // 创建一个Validator对象
/* 添加一些效验规则 */
validator.add(registerForm.userName,'isNotEmpty','用户名不能为空');
validator.add(registerForm.password,'minLength:6','密码长度不能小于6位');
validator.add(registerForm.userName,'mobileFormat','手机号码格式不正确');
var errorMsg = validator.start(); // 获得效验结果
return errorMsg; // 返回效验结果
};
var registerForm = document.getElementById("registerForm");
registerForm.onsubmit = function(){
var errorMsg = validateFunc();
if(errorMsg){
alert(errorMsg);
return false;
}
};
// 策略对象var strategys = { isNotEmpty: function(value,errorMsg) { if(value === '') { return errorMsg; } }, // 限制最小长度 minLength: function(value,length,errorMsg) { if(value.length < length) { return errorMsg; } }, // 手机号码格式 mobileFormat: function(value,errorMsg) { if(!/(^1[3|5|8][0-9]{9}$)/.test(value)) { return errorMsg; } }};var Validator = function(){ this.cache = []; // 保存效验规则};Validator.prototype.add = function(dom,rules) { var self = this; for(var i = 0, rule; rule = rules[i++]; ){ (function(rule){ var strategyAry = rule.strategy.split(":"); var errorMsg = rule.errorMsg; self.cache.push(function(){ var strategy = strategyAry.shift(); strategyAry.unshift(dom.value); strategyAry.push(errorMsg); return strategys[strategy].apply(dom,strategyAry); }); })(rule); }};Validator.prototype.start = function(){ for(var i = 0, validatorFunc; validatorFunc = this.cache[i++]; ) { var msg = validatorFunc(); // 开始效验 并取得效验后的返回信息 if(msg) { return msg; } }};// 代码调用var registerForm = document.getElementById("registerForm");var validateFunc = function(){ var validator = new Validator(); // 创建一个Validator对象 /* 添加一些效验规则 */ validator.add(registerForm.userName,[ {strategy: 'isNotEmpty',errorMsg:'用户名不能为空'}, {strategy: 'minLength:6',errorMsg:'用户名长度不能小于6位'} ]); validator.add(registerForm.password,[ {strategy: 'minLength:6',errorMsg:'密码长度不能小于6位'}, ]); validator.add(registerForm.phoneNumber,[ {strategy: 'mobileFormat',errorMsg:'手机号格式不正确'}, ]); var errorMsg = validator.start(); // 获得效验结果 return errorMsg; // 返回效验结果};// 点击确定提交registerForm.onsubmit = function(){ var errorMsg = validateFunc(); if(errorMsg){ alert(errorMsg); return false; }}
var shoeObj = {}; // 定义发布者
shoeObj.list = []; // 缓存列表 存放订阅者回调函数
// 增加订阅者
shoeObj.listen = function(fn) {
shoeObj.list.push(fn); // 订阅消息添加到缓存列表
}
// 发布消息
shoeObj.trigger = function(){
for(var i = 0,fn; fn = this.list[i++];) {
fn.apply(this,arguments);
}
}
// 小红订阅如下消息
shoeObj.listen(function(color,size){
console.log("颜色是:"+color);
console.log("尺码是:"+size);
});
// 小花订阅如下消息
shoeObj.listen(function(color,size){
console.log("再次打印颜色是:"+color);
console.log("再次打印尺码是:"+size);
});
shoeObj.trigger("红色",40);
shoeObj.trigger("黑色",42);
var shoeObj = {}; // 定义发布者
shoeObj.list = []; // 缓存列表 存放订阅者回调函数
// 增加订阅者
shoeObj.listen = function(key,fn) {
if(!this.list[key]) {
// 如果还没有订阅过此类消息,给该类消息创建一个缓存列表
this.list[key] = [];
}
this.list[key].push(fn); // 订阅消息添加到缓存列表
}
// 发布消息
shoeObj.trigger = function(){
var key = Array.prototype.shift.call(arguments); // 取出消息类型名称
var fns = this.list[key]; // 取出该消息对应的回调函数的集合
// 如果没有订阅过该消息的话,则返回
if(!fns || fns.length === 0) {
return;
}
for(var i = 0,fn; fn = fns[i++]; ) {
fn.apply(this,arguments); // arguments 是发布消息时附送的参数
}
};
// 小红订阅如下消息
shoeObj.listen('red',function(size){
console.log("尺码是:"+size);
});
// 小花订阅如下消息
shoeObj.listen('block',function(size){
console.log("再次打印尺码是:"+size);
});
shoeObj.trigger("red",40);
shoeObj.trigger("block",42);
var event = { list: [], listen: function(key,fn) { if(!this.list[key]) { this.list[key] = []; } // 订阅的消息添加到缓存列表中 this.list[key].push(fn); }, trigger: function(){ var key = Array.prototype.shift.call(arguments); var fns = this.list[key]; // 如果没有订阅过该消息的话,则返回 if(!fns || fns.length === 0) { return; } for(var i = 0,fn; fn = fns[i++];) { fn.apply(this,arguments); } }};
var initEvent = function(obj) {
for(var i in event) {
obj[i] = event[i];
}
};
// 我们再来测试下,我们还是给shoeObj这个对象添加发布-订阅功能;
var shoeObj = {};
initEvent(shoeObj);
// 小红订阅如下消息
shoeObj.listen('red',function(size){
console.log("尺码是:"+size);
});
// 小花订阅如下消息
shoeObj.listen('block',function(size){
console.log("再次打印尺码是:"+size);
});
shoeObj.trigger("red",40);
shoeObj.trigger("block",42);
event.remove = function(key,fn){
var fns = this.list[key];
// 如果key对应的消息没有订阅过的话,则返回
if(!fns) {
return false;
}
// 如果没有传入具体的回调函数,表示需要取消key对应消息的所有订阅
if(!fn) {
fn && (fns.length = 0);
}else {
for(var i = fns.length - 1; i >= 0; i--) {
var _fn = fns[i];
if(_fn === fn) {
fns.splice(i,1); // 删除订阅者的回调函数
}
}
}
};
// 测试代码如下:
var initEvent = function(obj) {
for(var i in event) {
obj[i] = event[i];
}
};
var shoeObj = {};
initEvent(shoeObj);
// 小红订阅如下消息
shoeObj.listen('red',fn1 = function(size){
console.log("尺码是:"+size);
});
// 小花订阅如下消息
shoeObj.listen('red',fn2 = function(size){
console.log("再次打印尺码是:"+size);
});
shoeObj.remove("red",fn1);
shoeObj.trigger("red",42);
$.ajax(“http://127.0.0.1/index.php”,function(data){ rendedData(data); // 渲染数据 doAnimate(data); // 实现动画});
$.ajax(“http://127.0.0.1/index.php”,function(data){ Obj.trigger(‘success’,data); // 发布请求成功后的消息});// 下面我们来订阅此消息,比如我现在订阅渲染数据这个消息;Obj.listen(“success”,function(data){ renderData(data);});// 订阅动画这个消息Obj.listen(“success”,function(data){ doAnimate(data);});
var Event = (function(){ var list = {}, listen, trigger, remove; listen = function(key,fn){ if(!list[key]) { list[key] = []; } list[key].push(fn); }; trigger = function(){ var key = Array.prototype.shift.call(arguments), fns = list[key]; if(!fns || fns.length === 0) { return false; } for(var i = 0, fn; fn = fns[i++];) { fn.apply(this,arguments); } }; remove = function(key,fn){ var fns = list[key]; if(!fns) { return false; } if(!fn) { fns && (fns.length = 0); }else { for(var i = fns.length - 1; i >= 0; i--){ var _fn = fns[i]; if(_fn === fn) { fns.splice(i,1); } } } }; return { listen: listen, trigger: trigger, remove: remove }})();// 测试代码如下:Event.listen("color",function(size) { console.log("尺码为:"+size); // 打印出尺码为42});Event.trigger("color",42);
<button id="count">点将我</button><div id="showcount"></div>
var a = (function(){ var count = 0; var button = document.getElementById("count"); button.onclick = function(){ Event.trigger("add",count++); }})();
var b = (function(){ var div = document.getElementById("showcount"); Event.listen('add',function(count){ div.innerHTML = count; });})();
<!doctype html><html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="global.js"></script> </head> <body> <button id="count">点将我</button> <div id="showcount"></div> <script src = "a.js"></script> <script src = "b.js"></script> </body></html>
function Hero(name) { this.name = name; this.enemy = null;}Hero.prototype.win = function(){ console.log(this.name + 'Won');}Hero.prototype.lose = function(){ console.log(this.name + 'lose');}Hero.prototype.die = function(){ this.lose(); this.enemy.win();}// 初始化2个对象var h1 = new Hero("朱元璋");var h2 = new Hero("刘伯温");// 给玩家设置敌人h1.enemy = h2;h2.enemy = h1;// 朱元璋死了 也就输了h1.die(); // 输出 朱元璋lose 刘伯温Won
var players = []; // 定义一个数组 保存所有的玩家function Hero(name,teamColor) { this.friends = []; //保存队友列表 this.enemies = []; // 保存敌人列表 this.state = 'live'; // 玩家状态 this.name = name; // 角色名字 this.teamColor = teamColor; // 队伍的颜色}Hero.prototype.win = function(){ // 赢了 console.log("win:" + this.name);};Hero.prototype.lose = function(){ // 输了 console.log("lose:" + this.name);};Hero.prototype.die = function(){ // 所有队友死亡情况 默认都是活着的 var all_dead = true; this.state = 'dead'; // 设置玩家状态为死亡 for(var i = 0,ilen = this.friends.length; i < ilen; i+=1) { // 遍历,如果还有一个队友没有死亡的话,则游戏还未结束 if(this.friends[i].state !== 'dead') { all_dead = false; break; } } if(all_dead) { this.lose(); // 队友全部死亡,游戏结束 // 循环 通知所有的玩家 游戏失败 for(var j = 0,jlen = this.friends.length; j < jlen; j+=1) { this.friends[j].lose(); } // 通知所有敌人游戏胜利 for(var j = 0,jlen = this.enemies.length; j < jlen; j+=1) { this.enemies[j].win(); } }}// 定义一个工厂类来创建玩家var heroFactory = function(name,teamColor) { var newPlayer = new Hero(name,teamColor); for(var i = 0,ilen = players.length; i < ilen; i+=1) { // 如果是同一队的玩家 if(players[i].teamColor === newPlayer.teamColor) { // 相互添加队友列表 players[i].friends.push(newPlayer); newPlayer.friends.push(players[i]); }else { // 相互添加到敌人列表 players[i].enemies.push(newPlayer); newPlayer.enemies.push(players[i]); } } players.push(newPlayer); return newPlayer;}; // 红队var p1 = heroFactory("aa",'red'), p2 = heroFactory("bb",'red'), p3 = heroFactory("cc",'red'), p4 = heroFactory("dd",'red'); // 蓝队var p5 = heroFactory("ee",'blue'), p6 = heroFactory("ff",'blue'), p7 = heroFactory("gg",'blue'), p8 = heroFactory("hh",'blue');// 让红队玩家全部死亡p1.die();p2.die();p3.die();p4.die();// lose:dd lose:aa lose:bb lose:cc// win:ee win:ff win:gg win:hh
var players = []; // 定义一个数组 保存所有的玩家
function Hero(name,teamColor) {
this.state = 'live'; // 玩家状态
this.name = name; // 角色名字
this.teamColor = teamColor; // 队伍的颜色
}
Hero.prototype.win = function(){
// 赢了
console.log("win:" + this.name);
};
Hero.prototype.lose = function(){
// 输了
console.log("lose:" + this.name);
};
// 死亡
Hero.prototype.die = function(){
this.state = 'dead';
// 给中介者发送消息,玩家死亡
playerDirector.ReceiveMessage('playerDead',this);
}
// 移除玩家
Hero.prototype.remove = function(){
// 给中介者发送一个消息,移除一个玩家
playerDirector.ReceiveMessage('removePlayer',this);
};
// 玩家换队
Hero.prototype.changeTeam = function(color) {
// 给中介者发送一个消息,玩家换队
playerDirector.ReceiveMessage('changeTeam',this,color);
};
// 定义一个工厂类来创建玩家
var heroFactory = function(name,teamColor) {
// 创建一个新的玩家对象
var newHero = new Hero(name,teamColor);
// 给中介者发送消息,新增玩家
playerDirector.ReceiveMessage('addPlayer',newHero);
return newHero;
};
var playerDirector = (function(){
var players = {}, // 保存所有的玩家
operations = {}; // 中介者可以执行的操作
// 新增一个玩家操作
operations.addPlayer = function(player) {
// 获取玩家队友的颜色
var teamColor = player.teamColor;
// 如果该颜色的玩家还没有队伍的话,则新成立一个队伍
players[teamColor] = players[teamColor] || [];
// 添加玩家进队伍
players[teamColor].push(player);
};
// 移除一个玩家
operations.removePlayer = function(player){
// 获取队伍的颜色
var teamColor = player.teamColor,
// 获取该队伍的所有成员
teamPlayers = players[teamColor] || [];
// 遍历
for(var i = teamPlayers.length - 1; i>=0; i--) {
if(teamPlayers[i] === player) {
teamPlayers.splice(i,1);
}
}
};
// 玩家换队
operations.changeTeam = function(player,newTeamColor){
// 首先从原队伍中删除
operations.removePlayer(player);
// 然后改变队伍的颜色
player.teamColor = newTeamColor;
// 增加到队伍中
operations.addPlayer(player);
};
// 玩家死亡
operations.playerDead = function(player) {
var teamColor = player.teamColor,
// 玩家所在的队伍
teamPlayers = players[teamColor];
var all_dead = true;
//遍历
for(var i = 0,player; player = teamPlayers[i++]; ) {
if(player.state !== 'dead') {
all_dead = false;
break;
}
}
// 如果all_dead 为true的话 说明全部死亡
if(all_dead) {
for(var i = 0, player; player = teamPlayers[i++]; ) {
// 本队所有玩家lose
player.lose();
}
for(var color in players) {
if(color !== teamColor) {
// 说明这是另外一组队伍
// 获取该队伍的玩家
var teamPlayers = players[color];
for(var i = 0,player; player = teamPlayers[i++]; ) {
player.win(); // 遍历通知其他玩家win了
}
}
}
}
};
var ReceiveMessage = function(){
// arguments的第一个参数为消息名称 获取第一个参数
var message = Array.prototype.shift.call(arguments);
operations[message].apply(this,arguments);
};
return {
ReceiveMessage : ReceiveMessage
};
})();
// 红队
var p1 = heroFactory("aa",'red'),
p2 = heroFactory("bb",'red'),
p3 = heroFactory("cc",'red'),
p4 = heroFactory("dd",'red');
// 蓝队
var p5 = heroFactory("ee",'blue'),
p6 = heroFactory("ff",'blue'),
p7 = heroFactory("gg",'blue'),
p8 = heroFactory("hh",'blue');
// 让红队玩家全部死亡
p1.die();
p2.die();
p3.die();
p4.die();
// lose:aa lose:bb lose:cc lose:dd
// win:ee win:ff win:gg win:hh
选择颜色: <select id="colorSelect"> <option value="">请选择</option> <option value="red">红色</option> <option value="blue">蓝色</option> </select> <p>输入购买的数量: <input type="text" id="numberInput"/></p> 你选择了的颜色:<div id="colorInfo"></div> <p>你输入的数量: <div id="numberInfo"></div> </p> <button id="nextBtn" disabled="true">请选择手机颜色和购买数量</button>
var goods = { // 手机库存 "red": 6, "blue": 8};
// 假设我们提前从后台获取到所有颜色手机的库存量
var goods = {
// 手机库存
"red": 6,
"blue": 8
};
/*
我们下面分别来监听colorSelect的下拉框的onchange事件和numberInput输入框的oninput的事件,
然后在这两个事件中作出相应的处理
*/
var colorSelect = document.getElementById("colorSelect"),
numberInput = document.getElementById("numberInput"),
colorInfo = document.getElementById("colorInfo"),
numberInfo = document.getElementById("numberInfo"),
nextBtn = document.getElementById("nextBtn");
// 监听change事件
colorSelect.onchange = function(e){
select();
};
numberInput.oninput = function(){
select();
};
function select(){
var color = colorSelect.value, // 颜色
number = numberInput.value, // 数量
stock = goods[color]; // 该颜色手机对应的当前库存
colorInfo.innerHTML = color;
numberInfo.innerHTML = number;
// 如果用户没有选择颜色的话,禁用按钮
if(!color) {
nextBtn.disabled = true;
nextBtn.innerHTML = "请选择手机颜色";
return;
}
// 判断用户输入的购买数量是否是正整数
var reg = /^\d+$/g;
if(!reg.test(number)) {
nextBtn.disabled = true;
nextBtn.innerHTML = "请输入正确的购买数量";
return;
}
// 如果当前选择的数量大于当前的库存的数量的话,显示库存不足
if(number > stock) {
nextBtn.disabled = true;
nextBtn.innerHTML = "库存不足";
return;
}
nextBtn.disabled = false;
nextBtn.innerHTML = "放入购物车";
}
选择颜色: <select id="colorSelect"> <option value="">请选择</option> <option value="red">红色</option> <option value="blue">蓝色</option> </select> <br/> <br/> 选择内存: <select id="memorySelect"> <option value="">请选择</option> <option value="32G">32G</option> <option value="64G">64G</option> </select> <p>输入购买的数量: <input type="text" id="numberInput"/></p> 你选择了的颜色:<div id="colorInfo"></div> 你选择了内存:<div id="memoryInfo"></div> <p>你输入的数量: <div id="numberInfo"></div> </p> <button id="nextBtn" disabled="true">请选择手机颜色和购买数量</button>
// 假设我们提前从后台获取到所有颜色手机的库存量var goods = { // 手机库存 "red|32G": 6, "red|64G": 16, "blue|32G": 8, "blue|64G": 18};/*我们下面分别来监听colorSelect的下拉框的onchange事件和numberInput输入框的oninput的事件,然后在这两个事件中作出相应的处理 */var colorSelect = document.getElementById("colorSelect"), memorySelect = document.getElementById("memorySelect"), numberInput = document.getElementById("numberInput"), colorInfo = document.getElementById("colorInfo"), numberInfo = document.getElementById("numberInfo"), memoryInfo = document.getElementById("memoryInfo"), nextBtn = document.getElementById("nextBtn"); // 监听change事件colorSelect.onchange = function(){ select();};numberInput.oninput = function(){ select();};memorySelect.onchange = function(){ select();};function select(){ var color = colorSelect.value, // 颜色 number = numberInput.value, // 数量 memory = memorySelect.value, // 内存 stock = goods[color + '|' +memory]; // 该颜色手机对应的当前库存 colorInfo.innerHTML = color; numberInfo.innerHTML = number; memoryInfo.innerHTML = memory; // 如果用户没有选择颜色的话,禁用按钮 if(!color) { nextBtn.disabled = true; nextBtn.innerHTML = "请选择手机颜色"; return; } // 判断用户输入的购买数量是否是正整数 var reg = /^\d+$/g; if(!reg.test(number)) { nextBtn.disabled = true; nextBtn.innerHTML = "请输入正确的购买数量"; return; } // 如果当前选择的数量大于当前的库存的数量的话,显示库存不足 if(number > stock) { nextBtn.disabled = true; nextBtn.innerHTML = "库存不足"; return; } nextBtn.disabled = false; nextBtn.innerHTML = "放入购物车"; }
DO U LIKE?