var Tool = function (id, name, price) {
/****** 私有属性 ******/
var that=this; // that被赋值为当前对象this,这样私有方法就可以通过that访问共有属性和方法了。
var goodsName = '',goodsPrice = 0;
/****** 对象共有属性 ******/
this.goodsId = id+10;
/****** 私有方法 ******/
function checkGoodsId() {
// 私有方法不能访问公共属性,this只有在实例化后调用才指向自身,在函数内直接运行是指向的Window,这里调用that,that已经被赋值为当前对象的this。
// console.log(this.goodsId , that.goodsId); // 这里的 this.goodsId 为undefined
return id>20;
}
/****** 特权方法 --- 可操作私有属性的方法 ******/
this.getName = function () {return goodsName};
this.setName = function (n) {goodsName=n};
this.getPrice = function () {return goodsPrice};
this.setPrice = function (p) {goodsPrice=p};
/****** 对象共有方法 ******/
// 将私有方法公开
function printId(){
console.log(this.goodsId)
}
this.printId=printId; // 实例化后可正常调用
// 直接定义
this.printNameAndPrice = function () {
// ...
if (checkGoodsId()){
console.log( goodsName + ',' + goodsPrice );
}else{
console.log('id<=20的产品不公开价格信息');
}
};
this.test = function () {
let that=this;
let opt={
a:'aA',
b:function () {
console.log(this.a,that.goodsId);
}
};
console.log(opt.b()); // aA
};
/****** 安全模式 ******/
if(this instanceof Tool){
// 这里面写初始化代码
// 比如 let a = new Tool();
this.setName(name);
this.setPrice(price);
}else{
// 比如 let a = Tool();
// 如果不这么做,let a = Tool(); 中 Tool() 只会执行函数返回函数的返回值(此函数没有返回值,所以会返回undefined)
return new Tool(id, name, price);
}
};
/****** 实例化 ******/
let a=new Tool(30,'apple',200);
/****** 拓展原型属性 ******/
Tool.prototype.pay=function(){
console.log('滴,已付款');
};
// 已实例化的对象也可调用原型拓展后的属性
a.pay();