标签:判断 区别 title 动作 pre net subclass 模式 ext
面向对象编程
面向对象编程就是将你的需求抽象成一个对象。然后针对这个对象分析其特征(属性)与动作(方法)。这个对象我们称之为类。面向对象编程思想其中的一个特点就是封装。
1、私有属性、私有方法、特权方法、对象公有属性、对象公有方法、构造器和类静态公有属性、类静态公有方法、公有属性、公有方法
var Book = function (id,name,price){
//私有属性
var num = 1;
//私有方法
function checkId(){};
//特权方法
this.getName = function(){};
this.getPrice = function(){};
this.setName = function(){};
this.setPrice = function(){};
//对象公有属性
this.id=id;
//对象公有方法
this.copy=function(){};
//构造器
this.setName(name);
this.setPrice(price);
};
//类静态公有属性(对象不能访问)
Book.isChinese = true;
//类静态公有方法(对象不能访问)
Book.resetTime = function(){
console.log(‘new Tiem‘)
};
Book.prototype = {
//公有属性
isJSBook : false;
display : function(){}
}
测试代码如下
var b = new Book(11,22,33);
console.log(b.num); //undefined
console.log(b.isJSBook); //false
console.log(b.id); //11
console.log(b.isChinese); //undefined
console.log(Book.isChinese); //true
Book.resetTime(); //new Tiem
2、闭包实现
闭包是有权访问另一个函数作用域中变量的函数,即在一个函数中创建另一个函数。
new关键字的作用可以看作是对当前对象的this不停的赋值。如果实例化的时候不写new就相当于在全局作用域中执行了实例化函数,那么实例化就会出现问题
由于小程序中没有window对象,所以在全局实例化不带new时候就会报错,但是网页中就不会报错。
解决忘记写new的方法是使用安全模式,代码如下:
var Book = function (title, time, type){
//判断执行过程中this是否是当前这个对象(如果是说明是用new创建的)
if(this instanceof Book){
this.title = title;
this.time = time;
this.type = type;
}else{
return new Book(title,time,type);
}
}
3、继承
new之后的变量是没有prototype的 ,只有__proto__属性,也就是实例化之后就没有prototype原型了,但是prototype是等于实例化之后的__proto__的。实例化之后的变量的__proto__中的constructor是等于实例化之前的构造函数的。
但是在打印实例化之后的构造函数时可以这样:
console.log(a.__proto__.constructor)
也可以这样
console.log(a.constructor)
打印出来的都是实例化之前的构造函数,因为如果查找一个属性在变量中找不到就会去变量的隐藏属性__proto__中去找。
JavaScript中除了数字、字符串、布尔值、null和undefined之外的就是对象了,所以数组是对象,对象之间相互赋值只是更换的内存地址,内存地址所指向的值都是一样的,是会相互影响的。
详情请戳这 JavaScript中值类型和引用类型的区别
下面放寄生组合式继承实例:
1 function inheritObject(o){ 2 function F(){} 3 F.prototype = o; 4 return new F(); 5 } 6 7 function inheritPrototype(subClass,superClass){ 8 var p = inheritObject(superClass.prototype); 9 console.log(p) 10 console.log(superClass) 11 p.constructor = subClass; 12 subClass.prototype = p 13 } 14 15 function SuperClass(name){ 16 this.name = name; 17 this.colors = ["red","blue","green"]; 18 } 19 SuperClass.prototype.getName = function(){ 20 console.log(this.name) 21 } 22 function SubClass(name,time){ 23 SuperClass.call(this,name) 24 this.time = time; 25 } 26 27 28 inheritPrototype(SubClass,SuperClass); 29 SubClass.prototype.getTime = function(){ 30 console.log(this.time) 31 } 32 var instance1 = new SubClass("js book",2014) 33 var instance2 = new SubClass("css book",2013) 34 35 instance1.colors.push("black") 36 console.log(instance1.colors) 37 console.log(instance2.colors) 38 instance2.getName(); 39 instance2.getTime();
4、多继承
标签:判断 区别 title 动作 pre net subclass 模式 ext
原文地址:https://www.cnblogs.com/Juaoie/p/9190905.html