• Java Script 读书笔记 (四) 面向对象编程


    1. 对象,属性

    前面看到对象里删除属性一直疑惑,什么是对象,为什么属性可以删除, 我印象里的属性还是停留在property, 总想不明白为什么属性竟然能够删除。直到看到标准库才明白,原来对象就是python里的字典,这个属性就是python里字典的key. delete就是删掉字典里面指定的一个值。这么简单的事如果有老师讲解会容易很多,用专业术语写出来的东西,作为新手真是费了好大劲才琢磨明白。

    对象应该与python里的字典不完全一样,JS的对象包括数组、函数、三种原始类型(数值、字符串、布尔值)在一定条件下,也会自动转为对象。

       书里面向对象一章解释了对象和属性:

         对象是一个容器,封装了属性(property)和方法(method). 属性是对象的状态,方法是对象的行为(完成某种任务).

        例如,可以把动物抽象为animal 对象, 使用属性记录具体是哪一种动物, 使用方法表示动物的某种行为。

    ? 如果属性是状态,那可以理解为什么能删除一种发生。但是上个例子中, 如果属性是动物类目,怎么能删除?属性到底是什么?怎么用?

    window: 代表取全局变量。

    2. 构造函数

        C++ /Java是典型的面向对象编程语言,存在”类“(class) 这个概念。

       ”类“ 就是对象的模板,对象就是”类“的实例。

        但是JavaScript 语言的对象体系,不是基于"类"的, 而是基于构造函数(constructor) 和原型链(prototype).

        JavaScript 语言使用构造函数 (consttructor)作为对象的模板。 所谓”构造函数“,就是专门用来生成对象的函数。它提供模板,描述对象的基本结构。一个构造函数,可以生成多个对象, 这些对象都有相同的结构。

       构造函数的写法就是一个普通的函数,但是有自己的特征和用法。为了与变通函数区别,构造函数名字的第一个字母通常大写。

    1 var Vehicle = function(){
    2    this.price=1000;
    3 };
    View Code

       构造函数的特点:
       > 函数体内部使用了this 关键字,代表了所要生成的对象实例。

       > 生成对象的时候,必需用new命令,调用Vehicle函数。

        new 命令 : 作用就是执行构造函数,返回一个实例对象。

    1 var Vehicle = function(){
    2   this.price =1000;
    3 };
    4 
    5 var v=new Vehicle();
    6 v.price //1000
    View Code

         上面代码通过new命令,让构造函数Vehicle生成一个实例对象,保存在变量v中。这个新生成的实例对象,从构造函数Vehicle继承了price属性。买  new 命令执行时,构造函数内部的this,就代表了新生成的实例对象,this.price表示实例对象有一个price属性, 值是1000.

         使用new 命令时,根据需要,构造函数也可以接受参数。

    1 var Vehicle = function(p){
    2    this.price=p;
    3 };
    4 
    5 var v =new Vehicle(500);
    View Code

       

    new 命令本身就可以执行构造函数,所以后面的构造函数可以带括号,也可以不带括号。下面两行代码是等价的:   

    1 var v=new Vehicle();
    2 var v=new Vehicle;
    View Code

    new 命令的原理

      使用new命令时, 它后面的函数调用就不是正常的调用,而是依次执行下面的步骤:

       1. 创建一个空对象,作为将要返回的对象实例。

        2. 将这个空对象的原型,指向构造函数的Prototype属性。

        3. 将这个空对象赋值给函数内部的this关键字。

         4. 开始执行构造函数内部的代码。

        构造函数内部,this指的是一个新生成的空对象,所有针对this的操作,都会发生在这个空对象上。 构造函数的目的就是操作一个空对象(即this 对象),将其构造成需要的样子。

        如果构造函数内部有return语句,而且return后面跟着 个对象,new 命令会返回return语句指定的对象;否则,就会不管return语句,返回this对象。

    1 var Vehicle =function(){
    2   this.price =1000;
    3   return 1000;
    4 };
    5 
    6 (new Vehicle())===1000
    7 // false
    View Code

        上面代码中, 构造函数Vehicle的return 语句一个数值。这时,new命令就会忽略这个return语句,返回构造后的this对象。但是,如果return语句是一个跟this无关的新对象,new 命令会返回这个新对象,而不是this对象。例:  

    1 var Vehicle = function(0{
    2     this.price=1000;
    3     return{price:2000};
    4 };
    5 
    6 (new Vehicle()).price
    7 //2000
    View Code

      上面代码中,构造函数Vehicle的return语句,返回的是一个新对象,new 命令会返回这个对象,而不是this 对象。

       另一方面,如果对变通函数(内部没有this关键字的函数)使用new 命令,则会返回一个空对象。

    1 function getMessage(){
    2    return "this is a messgae";
    3 }
    4 
    5 var msg=new getMessage();
    6 
    7 msg//{}
    8 typeof msg //"object"
    View Code

       上面代码中,getMessage是一个变通函数,返回一个字符串。对它使用new命令,会得到一个空对象,这是因为new命令总是返回一个对象,要么是实例对象,要么是return语句指定的对象,本例中, return语句返回的是字符串,所以new命令就忽略了该语句。

      

  • 相关阅读:
    使用Eclipse的坑
    约定优于配置
    Tomcat服务器使用和debug
    spring框架排错
    spring框架学习感悟
    Spring的标签和验证等模块
    11. Container With Most Water
    1367. Linked List in Binary Tree
    486. Predict the Winner
    205. Isomorphic Strings
  • 原文地址:https://www.cnblogs.com/cheese320/p/8042011.html
Copyright © 2020-2023  润新知