面向对象

面向对象

面向对象,继承、封装(封装构造函数)、多态。

​ 面向对象是一个编程思想,支撑面向对象编程思想的语法是类(ECMA6之前没有类这个概念)和对象,构造函数充当类的角色。

​ 构造函数和对象实现面向对象程序的时候,体现出 继承、 封装、 多态的特点。

	function Dog({name, type, age}){
                //this = new Object();
                //添加属性
                this.name = name;
                this.type = type;
                this.age = age;
            }
            /* 
                通过构造函数的原型添加方法
             */
             Dog.prototype = {
                 run: function(){
                     alert(this.name + "会飞快的奔跑");
                 },
                 showSelf: function(){
                     alert(`这是一个${this.type}的,${this.age}岁的,叫${this.name}的小狗`);
                 }
             }
             /* 
                分类更加细分的构造函数。继承
              */
            function Teddy({name, type, age, color}){
                //this = new Object();
                //1、继承父一级构造函数所有的属性
                //构造函数的伪装
                Dog.call(this, {
                    name: name,
                    type: type,
                    age: age
                })
                //添加自己的属性
                this.color = color;

                //return this;
            }

            /* 
                原型链继承
             */
            // Teddy.prototype = Dog.prototype;  非常错误的写法
            for(var funcName in Dog.prototype){
                Teddy.prototype[funcName] = Dog.prototype[funcName];
            }

            //在子一级构造函数重写showSelf方法
            /* 
                只会在子一级生效,并不会影响父一级构造函数的方法。

                继承和多态同一件事情的两种完全不同的侧重:
                继承:侧重是从父一级构造函数,继承到的属性和方法。
                多态:侧重是,子一级,自己重写和新增的属性和方法。
             */
            Teddy.prototype.showSelf = function(){
                alert(`这是一个${this.type}的,${this.age}岁的,是${this.color}的,叫${this.name}的小狗`);
            }


            Teddy.prototype.showColor = function(){
                alert(this.color);
            }


            var xiaohong = new Teddy({
                name: "小红",
                type: "泰迪",
                age: 10,
                color: "红色"
            })

            xiaohong.showSelf();
          

            var xiaohei = new Dog({
                name: "小黑",
                type: "拉布拉多",
                age: 5
            });
            xiaohei.showSelf();

继承的写法:

	function Teddy({name, type, age, color}){
                //this = new Object();
                //1、继承父一级构造函数所有的属性
                //构造函数的伪装
                Dog.call(this, {
                    name: name,
                    type: type,
                    age: age
                })
                //添加自己的属性
                this.color = color;

                //return this;
            }

方法的继承:

/* 
  原型链继承
 */
//通过for...in遍历继承
    for(var funcName in Dog.prototype){
        Teddy.prototype[funcName] = Dog.prototype[funcName];
     }
//Object.creat继承
Teddy.prototype = Object.create(Dog.prototype);
//调用构造函数继承
Teddy.prototype = new Dog();

重写父类方法:

Teddy.prototype.showSelf = function(){
                alert(`这是一个${this.type}的,${this.age}岁的,是${this.color}的,叫${this.name}的小狗`);
            }

子类自己的方法:

Teddy.prototype.showColor = function(){
                alert(this.color);
            }

__proto__

构造函数构造出来的对象,有一个属性__proto__,指向构造出这个对象的构造函数的原型。

instanceof 关键字

功能:判断某一个对象是否是这个构造函数构造出来的。

上一篇:PIL中的Image转化为数组array的方法


下一篇:类的属性 静态方法 一般方法 构造方法