• 原型


    1.在默认情况下,所有原型对象都会自动获得一个constructor属性,这个属性包含一个
    指向prototype属性所在函数的指针。

    2.ES5增加的一个新方法 返回对象的原型 isPrototypeOf()

    3.可以通过对象实例访问保存在原型的值,但是不能通过对象实例重写原型的值。如果
    在实例中添加一个属性,该属性与实例原型中的一个属性同名,那在实例中创建的该属
    性,就会屏蔽原型中的这个属性。虽然是屏蔽了,但是不会修改原型中的这个属性值,
    可以使用delete,把实例中的这个属性删除。从而继续访问原型中的这个属性。

    4.使用hasOwnProperty()方法可以检测一个属性是存在于实例中,还是存在于原型中
    。这个方法是从Object中继承来的,只在给定属性存在于对象实例中,才会返回true.

    function Person(){}

    Person.prototype.name="Nicholas";
    Person.prototype.age=29;
    Person.prototype.job="Software 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); //"Greg"----来自实例
    alert(person1.hasOwnProperty("name")); //true

    alert(person2.name); //"Nicholas" 来自原型
    alert(person2.hasOwnProperty("name")) //false

    delete person1.name;
    alert(person1.name); //"Nicholas" 来自原型
    alert(person1.hasOwnProperty("name")) //false


    5.更简单的原型语法
    function(){}

    Person.prototype={
    constructor:Person,
    name:"Nicholas",
    age:29,
    job:"Software Engineer",
    sayName:function(){
    alert(this.name);
    }
    }


    6.实例中的指针指向原型,而不是指向构造函数

    function Person(){}

    var friend=new Person();

    Person.prototype={
    constructor:Person,
    name:"Nicholas",
    age:29,
    job:"Software Engineer",
    sayName:function(){
    alert(this.name);
    }
    }

    friend.sayName();//error


    这段代码发生了错误。首先创建了Person的一个实例,然后写了一个构造函数。最后写
    了原型对象。在中间写个构造函数,就相当于重写了原型对象,而实例中的指针指向原
    型,不是构造函数。构造函数中没有name属性。所以导致报错。


    7.组合使用构造函数和原型模式。。就是构造函数模式用于定义实例属性,而原型模式
    用于定义方法和共享的属性。。这样,每个实例都会有自己的一份实例属性的副本,但
    同时又共享着对方法的引用。

    function Person(name,age,job){
    this.name=name;
    this.age=age;
    this.job=job;
    this.friend=["Shelby","Court"];
    }

    Person.prototype={
    constructor:Person,
    sayName:function(){
    alert(this.name);
    }
    }

    var person1=new Person("Nicholas",29,"Software Engineer");
    var person2=new Person("Greg",27,"Doctor");

    person1.friend.push("Van");
    alert(person1.friend); //"Shelby,Court,Van"
    alert(person2.friend); //"Shelby,Court"
    alert(person1.friend===person2.friend); //false
    alert(person1.sayName===person2.sayName); //true

  • 相关阅读:
    c++最大公约数
    c++判断一个整数里面是否包含 3 这个数字
    动态使用webservice,以及含有ref类型的参数的问题
    带有用户名密码验证的远程文件下载
    注册表
    fsdfasfsa
    C# addin 开发心得记录
    c# 读写注册表
    like的性能问题
    查找表中多余的重复记录(多个字段)
  • 原文地址:https://www.cnblogs.com/chaofei/p/5912041.html
Copyright © 2020-2023  润新知