zoukankan      html  css  js  c++  java
  • 面向对象的目的和方式

    1. 面向对象的目的就是生成对象object
    2. 生成对象的方式

    (1)      单例模式(字面量定义)var obj={}

    (2)      类的实例  var obj=new Obeject()

    (3)      工厂模式

    (4)      构造函数

    工厂模式
    // function create(name,age){
    // var obj={};
    // obj.name=name;
    // obj.age=age;
    // return obj;
    // }
    // var zz=create("王八",23)
    // 构造函数模式
    // function Person(name,age){
    // this.name=name;
    // this.age=age;
    // }
    // var zz=new Person("list",25)
    // console.log(zz)

    工厂模式,生成的对象需要返回,构造函数模式不用return,构造函数模式默认return的是this,在构造函数内的this就是实例对象;

    构造函数如果人为return的不是对象,直接忽略,如果人为return的是对象,就取代this。

    工厂模式生成的实例对象的__proto__直接指向基类Object的原型

    构造函数生成的实例对象的__proto__指向他父类的原型,然后父类的原型上的__proto__指向基类Object的原型。

    每个实例和实例之间都是独立的个体,他们之间的属性互不干扰,是不等的,如果实例和实例之间的属性相等,则这个属性必须是父类的原型上的属性。是因为父类原型上的属性是可继承的,是共享的。

    在操作obj.属性的时候,首先看这个属性是私有的还是从父类的原型上继承的,如果是私有的直接使用,如果私有的没有呢就查看父类的原型上有没有,如果有就直接使用,如果没有呢,再次向父类的父类的原型上查找,一直查到基类Object上为止,如果object也没有就得到undefined。这就是原型链。

    实例的__proto__上的属性。

    function Fn(){
    this.x=74;
    this.y=56;
    }
    Fn.prototype={
    x:44,
    z:55
    }
    Object.prototype.w=77;
    var ss=new Fn()
    // 判断对象是不是这个类的实例对象
    var sd={name:"list"}
    console.log(sd instanceof Fn)
    // 获取实例对象的原型
    console.log(Object.getPrototypeOf(ss))
    // hasOwnproperty()判断一个属性是不是自身(私有)的属性
    console.log(ss.hasOwnProperty("z"))
    // 实例对象的原型就是他父类的原型
    console.log(ss.__proto__==Fn.prototype)
    // in判断一个属性是不是这个对象上的(无论私有还是公有)
    console.log("w" in ss)

    如果不给类的原型指定一个对象,这个实例对象的__proto__上有一个constructor的属性。如果给这个类的原型指定了一个对象,实例上的__proto__就没有constructor属性了。

    构造函数里和原型里的this都是指向实例对象

    This指向问题

    1. this是一个对象,函数外的this都指向window,
    2. 函数内的this,他的指向跟函数调用有关,看函数前面有没有.,有点就指向.前面的对象,没有就指向window。
    3. 定时器的this永远是window,自执行函数里的this是window。
    4. 构造函数里的this和原型上的this都指向实例对象

    改变this指向的方法

    提前将this赋值

    Call

    Apply call和apply执行是一样的都是将前面函数内的this改成第一个参数,然后执行前面的函数,不同在从第二个参数开始 apply是一个数组

    Bind bind是只改变前面函数的this,但是不执行前面的函数,需要加一个()才执行

    继承

    1.call继承 子类继承父类

    将父类的私有属性继承为子类的私有属性

    function A(){//父类
    this.name="zhang"
    }
    A.prototype.ss="ssssss"
    function B(){//子类
    this.age=23;
    A.call(this)//首先执行call函数将中的this换成B的实例对象
    }
    var a=new A()
    var b=new B()
    console.log(b)

    2.原型继承 将父类的私有和公有属性都继承为子类的公有属性

    子类的原型=父类的实例 B.prototype=new A()

    function A(){//父类
    this.name="zhang"
    }
    A.prototype.ss="ssssss"
    function B(){//子类
    this.age=23;
    A.call(this)//首先执行call函数将中的this换成B的实例对象
    }
    B.prototype=new A;
    var a=new A()
    var b=new B()
    console.log(b)

  • 相关阅读:
    复杂json格式转化为javabean
    lambda常用方法
    solr设置分片和副本
    Python之Scrapy爬虫框架安装及简单使用
    40多个纯CSS绘制的图形
    windows下自动启动Redis隐藏命令行窗口
    用Webpack构建Vue项目
    上传本地代码到gitHub过程详解
    html/css常用合集
    数据库索引与b+树
  • 原文地址:https://www.cnblogs.com/mo123/p/10213086.html
Copyright © 2011-2022 走看看