面向对象、作用域、构造函数方式(工厂方式)

94 阅读3分钟
对象:
    ECIMA-262 把对象(object) 定义为"属性(变量)的无序集合, 每个属性存放一个原始值、对象或函数"。严格来说,
这意味着对象是无特定顺序的值的数组。

尽管EOIAScript如此定义对象,但它更通用的定义是基于代码的名词(人、地点或事物)的表示。

类:
    每个对象都由类定义,可以把类看做对象的配方。类不仅要定义对象的接口(interface) (开发者访问的属性和方法),
还要定义对象的内部工作(使属性和方法发挥作用的代码)。编译器和解释程序都根据类的说明构建对象。

实例:
    程序使用类创建对象时,生成的对象叫作"类的实例(instance)"。对类生成的对象的个数的唯限制来自于运行代码的
机器的物理内存。每个实例的行为相同,但实例处理组独立的数据。 由类创建对象实例的过程叫做实例化(instantiation) 

js中所有内容都是对象:一种为普通对象;一种为实例对象(用new生成的对象为实例对象,写new的过程叫做实例化)

面向对象特点

    封装:把相关的信息(无论数据或方法)存储在对象中的能力
    聚集:把一个对象存储在另一个对象内的能力
    继承:由另一个类(或多个类)得来类的属性和方法的能力
    多态:编写能以多种方法运行的函数或方法的能力

作用域:
    公用域指的是变量的适用范围。
    公用、私有和受保护作用域
    
传统定义:

    主要关注于公用和私有作用域。公用作用域中的对象属性可以从对象外部访问,即开发者创建对象的实

    而私有作用域中的属性只能在对象内部访问,即对于外部世界来说,这些属性并不存在
    
    受保护作用域也是用于定义私有的属性和方法,只是这些属性和方法还能被其子类访问。

ECMAScript只有公用作用域:

    ECMAScript中只存在一种作用域-公用作用域。ECMAScript 中的所有对象的所有属性和方法都是公用的
    
this的作用:

    在ECMAScript中,要掌握的最重要的概念之一是关键字this的用法,它用在对象的方法中。关键字this总是指向
调用该方法的对象


构造函数方式:
    创建函数就像创建工厂函数一样容易,第一步是选择类名,即构造函数的名字

实例:
        function Car(sColor, iDoors, iMpg) {
            this.color = sColor;
            this.doors = iDoors;
            this.mpg = iMpg;
            this.shoncolor = function () {
                alert(this.color);
            };
        }
        var oCarl = new Car("red", 4, 23);
        var oCar2 = new Car("blue", 3, 25);
        
        
构造函数在java中类名相同的函数

功能:初始化对象必备函数,作用也是初始化函数

区分当前函数是构造函数还是普通函数取决于是否有this(构造有)

调用区别:构造函数调用数必须用new创建新对象,普通函数直接调用

实例:
    <script>
        function Car(sColor, iDoors, iMpg) {
            this.color = sColor;
            this.doors = iDoors;
            this.mpg = iMpg;
            this.showcolor = function () {
                alert(this.color);
                alert(this.doors);
                alert(this.mpg)
            };
        }
        var oCarl = new Car("red", 4, 23);//new(初始化对象)
        var oCar2 = new Car("blue", 3, 25);
        oCarl.showcolor();
    </script>
    
    //姓名班级年龄成绩
    <script>
        function student(iname, iclass, iage, inum) {
            this.name = iname;
            this.class = iclass;
            this.age = iage;
            this.num = inum;
            this.xin = function () {
                var arr = [
                    this.name,
                    this.class,
                    this.age,
                    this.num
                ]
                alert(arr)
            }
        }
        var oname1 = new student("张三", 20, "3班");
        var oname2 = new student("李四", 19, "2班");
        oname1.xin();
        oname2.xin();
    </script>