zoukankan      html  css  js  c++  java
  • js面向对象

    1.认识面向对象:

    为了说明 JavaScript 是一门彻底的面向对象的语言,首先有必要从面向对象的概念着手 , 探讨一下面向对象中的几个概念:

    • 一切事物皆对象
    • 对象具有封装和继承特性
    • 对象与对象之间使用消息通信,各自存在信息隐藏

    实际上,JavaScript 语言是通过一种叫做 原型(prototype的方式来实现面向对象编程的。下面就来讨论 基于类的(class-based)面向对象基于原型的 (prototype-based) 面向对象这两种方式在构造客观世界的方式上的差别。

    在基于类的面向对象方式中,对象(object依靠 类(class来产生。而在基于原型的面向对象方式中,对象(object则是依靠 构造器(constructor利用 原型(prototype构造出来的。举个客观世界的例子来说明二种方式认知的差异。例如工厂造一辆车,一方面,工人必须参照一张工程图纸,设计规定这辆车应该如何制造。这里的工程图纸就好比是语言中的 类 (class),而车就是按照这个 类(class制造出来的;另一方面,工人和机器 ( 相当于 constructor) 利用各种零部件如发动机,轮胎,方向盘 ( 相当于 prototype 的各个属性 ) 将汽车构造出来。

    首先,客观世界中的对象的产生都是其它实物对象构造的结果,而抽象的“图纸”是不能产生“汽车”的,也就是说,类是一个抽象概念而并非实体,而对象的产生是一个实体的产生;

    其次,按照一切事物皆对象这个最基本的面向对象的法则来看,类 (class) 本身并不是一个对象,然而原型方式中的构造器 (constructor) 和原型 (prototype) 本身也是其他对象通过原型方式构造出来的对象。

    再次,在类式面向对象语言中,对象的状态 (state) 由对象实例 (instance) 所持有,对象的行为方法 (method) 则由声明该对象的类所持有,并且只有对象的结构和方法能够被继承;而在原型式面向对象语言中,对象的行为、状态都属于对象本身,并且能够一起被继承,这也更贴近客观实际。

    最后,类式面向对象语言比如 Java,为了弥补无法使用面向过程语言中全局函数和变量的不便,允许在类中声明静态 (static) 属性和静态方法。而实际上,客观世界不存在所谓静态概念,因为一切事物皆对象!而在原型式面向对象语言中,除内建对象 (build-in object) 外,不允许全局对象、方法或者属性的存在,也没有静态概念。所有语言元素 (primitive) 必须依赖对象存在。但由于函数式语言的特点,语言元素所依赖的对象是随着运行时 (runtime) 上下文 (context) 变化而变化的,具体体现在 this 指针的变化。正是这种特点更贴近 “万物皆有所属,宇宙乃万物生存之根本”的自然观点。

    知识点:
    (1)JS面向对象基础:ECMA-262把对象定义为:“无序属性的集合,其属性可以包含基本值、对象或者函数”。
    (2)JS创建对象的方法:
      (a)工厂模式:用函数来封装以特定接口创建对象的细节。
          function createPerson(name, age, job){
              var o = new Object();
              o.name = name;
              o.age = age;
              o.job = job;
              o.sayName = function(){
              alert(this.name);
              };
          return o;
          }
        var person1 = createPerson(“Nicholas”, 29, “Software Engineer”);
        var person2 = createPerson(“Greg”, 27, “Doctor”);
        缺点:工厂模式虽然解决了创建多个相识对象的问题,但却没有解决对象识别的问题(即怎样知道一个对象的类型)。
      (b)构造函数模式:ECMAScript中的构造函数可以用来创建特定类型的对象。可以创建自定义的构造函数,从而定义自定义对象类型的属性和方法。
          function Person(name, age, job){
            this.name = name;
            this.age = age;
            this.job = job;
            this.sayName = function(){
            alert(this.name);
            };
          }
          var person1 = new Person(“Nicholas”, 29, “Software Engineer”);
          var person2 = new Person(“Greg”, 27, “Doctor”);
        缺点:使用构造函数的主要问题,就是每个方法都要在每个实例上重新创建一遍。不要忘了——ECMAScript中的函数是对象,因此每定义一个函数,
        就是实例化一个对象。
      (c)原型模式:我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型
        的所有实例共享的属性和方法。使用原型对象的好处是可以让所有对象共享它包含的属性和方法
          function Person(){
          }
          Person.prototype.name = “Nicholas”;
          Person.prototype.age = 29;
          Person.prototype.job = “Software Engineer”;
          Person.prototype.sayName = function(){
            alert(this.name);
          };
          var person1 = new Person();
          person1.sayName(); //”Nicholas”
          var person2 = new Person();
          person2.sayName(); //”Nicholas”
          alert(person1.sayName == person2.sayName); //true
        缺点:原型中所有属性是被很多实例共享的,这种共享对于函数非常合适。但是对于引用类型值的属性来说,问题就比较突出了。
        (d)组合使用构造函数模式和原型模式:创建自定义类型的最常见方式,就是使用组合使用构造函数模式和原型模式。构造函数模式用于定义实例属性,
          而原型模式用于定义方法和共享的属性。
          function Person(name, age, job){
            this.name = name;
            this.age = age;
            this.job = job;
            this.friends = [“Shelby”, “Court”];
          }
          Person.prototype = {
            constructor: Person,
            sayName : function () {
            alert(this.name);
            }
          };
          var person1 = new Person(“Nicholas”, 29, “Software Engineer”);
          var person2 = new Person(“Greg”, 27, “Doctor”);
          person1.friends.push(“Van”);
          alert(person1.friends); //”Shelby,Court,Van”
          alert(person2.friends); //”Shelby,Court”
          alert(person1.friends === person2.friends); //false
          alert(person1.sayName === person2.sayName); //true

     

  • 相关阅读:
    codeforces#1310B. Double Elimination(动态规划)
    codeforces#1300E. Water Balance(贪心)
    带权并查集
    codeforces#1295D. Same GCDs(数论/莫比乌斯)
    jsp实现图片换行显示
    codeforces#1257 F. Make Them Similar ( 经典中间相遇问题 )
    codeforces#1248D2. The World Is Just a Programming Task(括号匹配转化为折线处理)
    codeforces#1251E2. Voting (Hard Version)(贪心)
    codeforces#1249F. Maximum Weight Subset(树上dp)
    hdu6731 Angle Beats(ccpc秦皇岛A,计算几何)
  • 原文地址:https://www.cnblogs.com/flower-qh/p/7123732.html
Copyright © 2011-2022 走看看