zoukankan      html  css  js  c++  java
  • 原型模式

    每个构造函数都有一个原型属性(prototype)这个原型属性指向一个原型对象,我们可以给这个原型对象设置属性和方法,这些属性和方法可以给通过该构造函数创建的对象使用。         换句话说,也可以理解为通过该构造函数创建出来的对象,继承于这个原型对象,可以直接使用原型对象的属性和方法。

    以下这种创建对象的有一个好处就是相比较上面而言,更节省空间,上面的方法在不同的对象里,下面的是无论创造出多少对象,共用一个方法,也就是说方法在同一块内存堆里

    function Person(name){

    this.name=name;

    }

    Person.prototype.sayHello=function(){

    //这个this依然表示当前通过Person构造函数创建出来的对象

    console.log("大家好,我叫:"+this.name);

    }

    与原型相关的知识点

    1.支持运行时添加方法,在添加方法之前创建的对象,依然可以使用这个方法

    也就是说,我先new出了实例对象来,我又在下面给构造函数添加了方法,这个上面new出来的实例依然可以使用这个方法

    2.也可以给内置构造函数的原型添加方法

    String.prototype.reverse = function () {

    var resultStr = "";

    for (var i = this.length - 1; i >=0; i--) {

    resultStr += this[i];

    }

    return resultStr;}  str.reverse()  "小雪转大雪".reverse()

    3.也支持重新覆盖掉,原来的方法,

    注意:!!!!不到万不得已的时候,千万别去覆盖系统自带的方法。否则后果自负!!!!

    Array.prototype.indexOf = function (ele) {

    console.log("乱改!");

    }

    原型链及其原型方法和属性相关

    何为原型链:

    每个对象都有一个对应的原型对象,这个原型对象本身也是一个对象,那么既然它也是一个对象,所以它也应该会有一个属于它的原型对象,以此类推,一直到Object.prototype为止。Object.prototype的原型是null。通过以上分析,会形成一条链子,这条链子被称作为原型链。

    例:

    //通过不同的方式来生成原型链

    var obj = {

    "name" : "小雪"

    }

    obj对象继承了Object.prototype的属性和方法

    所生成的原型链为:

    obj --> Object.prototype --> null

    数组

    var arr = ["小雪", "小王"];

    arr对象继承了Array.prototype的属性和方法

    所生成的原型链为:

    arr --> Array.prototype --> Object.prototype --> null

    函数

    function fn () {

    console.log("小雪");

    ·· }

    fn对象继承了Function.prototype的属性和方法

    所生成的原型链为:

     fn --> Function.prototype --> Object.prototype --> null

    自定义对象

    function Person (name) {

    this.name = name;

    }

    var person1 = new Person("小雪");

    person1对象继承了Person.prototype的属性和方法

    生成的原型链为:

    person1 --> Person.prototype --> Object.prototype --> null

    //Object.create():这个方法可以用来创建对象,创建出来的对象继承于这个方法的参数。换一句话说,也就是,这个方法的参数是一个对象,而且它是创建出来的那个对象的原型对象。

    var a = {

    "name" : "包女士"

    }

    //通过Obejct.create方法生成一个新的对象

    var b = Object.create(a);

    //生成的原型链:b --> a --> Object.prototype --> null

    console.log(b.name);

    var c = Object.create(b);

    //生成的原型链:c --> b --> a --> Object.prototype --> null

    console.log(c.name);

    var d = Object.create(null);

    //生成的原型链:d --> null

    //constructor每个原型对象都有constructor属性,这个属性指向的是该原型对象所在的构造函数

    console.log(Person.prototype.constructor);

    console.log(person1.constructor);

    //hasOwnProperty(): 判断一个对象是否有某个属性,返回值是一个布尔值

    console.log(Person.prototype.hasOwnProperty("constructor"));

    console.log(person1.hasOwnProperty("constructor"));  //false  ,证明这个constructor不是person1的,是继承来的

    总结:当调用某个对象的属性或方法的时候,首先去查找该对象自身是否有这个属性和方法,如果没有的话,就沿着原型链去往上找,如果找到了就可以直接使用,如果没找到,就继续找,以此类推,直到找到null为止。

    Object.getPrototypeOf(): 返回一个对象的原型对象

    console.log(Object.getPrototypeOf(person1));

    isPrototypeOf(): 判断一个对象是否是另外一个对象的原型对象

    console.log(b.isPrototypeOf(c)); //bc的原型对象所以是true

    欢迎大家一起交流 相互学习
  • 相关阅读:
    子页面与父页面相互调用函数、元素、变量
    springboot项目多数据源及其事务
    mybatis逆向工程
    PageHelper 分页插件
    spring boot 在eclipse中打war包,及jar包
    Spring 定时任务之 @Scheduled cron表达式
    发送邮件
    spring+springmvc+hibernate 框架搭建
    MySQL驱动和数据库字符集设置不搭配
    Oracle与MySQL区别
  • 原文地址:https://www.cnblogs.com/zss1/p/8933142.html
Copyright © 2011-2022 走看看