码迷,mamicode.com
首页 > 编程语言 > 详细

阅读《JavaScript设计模式》第二章心得

时间:2018-06-17 17:52:48      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:判断   区别   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、多继承

 关于js中的for  in和in用法

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

阅读《JavaScript设计模式》第二章心得

标签:判断   区别   title   动作   pre   net   subclass   模式   ext   

原文地址:https://www.cnblogs.com/Juaoie/p/9190905.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!