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

    1.什么是原型模式?有什么用?

    是一个指向对象的指针。可以让所有对象实例包含它所包含的所有属性和方法,不必在构造函数中定义对象实例的信息。

    function Person(){}
    
    Person.prototype.name="jack";
    Person.prototype.age=29;
    Person.prototype.job="engineer";
    Person.prototype.sayName=function(){
        alert(this.name);
    };
    
    var person1 = new Person();
    person1.sayName();
    
    var person2 = new Person();
    person2.sayName();
    
    alert(person1.sayName == person2.sayName);//"jakc"

     2.相关的方法有哪些?

    isPrototypeOf()方法:确定对象之间是否存在某种关系

    alert(Person.prototype.isPrototyoeOf(person1)); //true

    Object.getPrototypeOf()方法:返回[[Prototype]]的值。可以方便地获取一个对象的原型

    alert(Object.getPrototypeOf(person1) == Person.prototype); //true
    alert(Object.getPrototypeOf(person1).name) //"Nicholas"

    先从实例中找,如果实例中不存在该属性,那就从原型中去找。

    hasOwnProperty()方法:检测一个属性是存在于实例中还是原型中。

    function Person(){}
    
    Person.prototype.name="Nicholas";
    Person.prototype.age=29;
    Person.prototype.job="engineer";
    Person.prototype.sayName=function(){
        alert(this.name);
    };
    
    var person1 = new Person();
    var person2 = new Person();
    
    alert(person1.hasOwnProperty("name"));//false
    
    
    person1.name = "Greg";
    alert(person1.name);//G
    alert(person1.hasOwnProperty("name"));//true
    
    alert(person2.name);//N
    alert(person2.hasOwnProperty("name"));//flase
    
    delete person1.name;
    alert(person1.name);//N
    alert(person1.hasOwnProperty("name"));//false

    只有当person1重写name属性后才会返回true,因为只有这时候name才是一个实例属性,而非原型属性。

    hasPrototypePrototype(): alert(hasPrototypeProperty(person,"name")); 

    Object.keys()方法:

    function Person(){}
    
    Person.prototype.name="Nicholas";
    Person.prototype.age=29;
    Person.prototype.job="engineer";
    Person.prototype.sayName=function(){
        alert(this.name);
    };
    
    var keys = Object.keys(Person.prototype);
    alert(keys);//"name,age,job,sayName"
    
    var p1 = new Person();
    p1.name = "Rob";
    p1.age = 31;
    var p1keys = Object.keys(p1);
    alert(p1keys); //"name,age"

    接收一个对象作为参数,返回一个包含所有可枚举属性的字符串数组(按顺序)。

    Object.getOwnPropertyName()方法:

    var keys = Object.getOwnPropertyNames(Person.prototype);
    alert(keys);  //constructor,name,age,job,sayName

    Object.keys()和Object.getOwnPropertyNames()方法都可以用来替代for-in循环

    Object.defineProperty():

  • 相关阅读:
    [bzoj3218] a+b problem [最小割+数据结构优化建图]
    [bzoj3456] 城市规划 [递推+多项式求逆]
    [ARC068F] Solitaire [DP]
    [bzoj3601] 一个人的数论 [莫比乌斯反演+高斯消元]
    [中山市选2011][bzoj2440] 完全平方数 [二分+莫比乌斯容斥]
    [bzoj2159] Crash的文明世界 [斯特林数+树形dp]
    [bzoj2839] 集合计数
    通用解题方法—回溯法
    分支限界法—单源最短路径问题
    分支限界法
  • 原文地址:https://www.cnblogs.com/n2meetu/p/6741862.html
Copyright © 2011-2022 走看看