JavaScript 原型、原型链

原型

  • 定义:原型是function对象的一个属性,它定义了构造函数制造出的对象的公共祖先。通过该构造函数产生的对象,可以继承该原型的属性和方法。原型也是对象。
  • 利用原型特点和概念,可以提取共有属性。
  • 对象如何查看原型 --> 隐式属性_ _ proto _ _
    • _ _ proto _ _是函数里面的隐式属性,就像一个指针,指向函数的原型(祖先),若果改变它,那么原型将会改变,对应的,继承的对象也会改变。

例题:

<script type = "text/javascript"> 
    Person.prototype.name = 'abc';
    functon Person() {
        //var this = {
        //
        // __proto__:Person.prototype   //本来__proto__是函数里面的隐式属性,其原型为Person.prototype,继承的name属性为'abc'
        //}
    var obj = {
        name : "sunny"
    }
    var person = new Person();
    person.__proto__ = obj;      //在这里将其指向改变,此时其原型为obj,继承的name属性为'sunny'
    console.log(person.name);
</script>

//sunny


例题:

<script type = "text/javascript"> 
    Person.prototype.name = 'sunny';
    functon Person() {
        //var this = {__proto__:Person.prototype } var person = new Person();      //已经new好了,后面再改也没用
    Person.prototype = {
        name : 'cherry'             //再改也是在新生成的房间里面改,和刚才new的那个房间没有关系
    }
    console.log(person.name);
</script>

//sunny


例题:

<script type = "text/javascript"> 
    Person.prototype.name = 'sunny';
    functon Person() {
        //var this = {__proto__:Person.prototype }   
    }
     Person.prototype = {
        name : 'cherry'             //而后面出现的会覆盖前面的,new还没生成就变好了
    }
    var person = new Person();      //有new才会出现第4行//var this = {__proto__:Person.prototype }
    console.log(person.name);
</script>

//cherry


  • 对象如何查看对象的构造函数 --> constructor
    // Person.prototype --原型
    // Person.prototype={} --是祖先

  • 原型的增删改查
    均在原型(祖先)本身改,无法通过后代来改变祖先的属性。

原型链

通过原型连起来的链式结构,自子集至父级依次调用。

例题:

<script type = "text/javascript"> 
    Person.prototype = {
        name : "a",
        sayName : function() {
            console.log(this.name);    //sayName里面的this指向:谁调用的这个方法,this就是指向谁
        }
    }
    function Person() {
    this.name = "b";
    }
    var person = new Person();
</script>
//person.sayName()   --  b
//Person.prototype.sayName()  -- a

例题:

<script type = "text/javascript"> 
    Person.prototype = {
        height : 100function Person() {
        this.eat = function() {
            this.height ++;          //相当于height = height + 1 ,将父级的height拿来给自己++,加完就变成自己的了,而父亲的height还是不变
        }
    }
    var person = new Person();
</script>


  • 绝大多数对象的最终都会继承自Object.prototype

    • 对象的原型只能是一个object或null,但null没有原型,也没有proto属性
    • 原型类属性是系统内部属性,自己加是不管用的
  • Object.create(原型)

// var obj = Object.create(原型);
var obj = {name : "sunny",age : 123};
var obj1 = Object.create(obj);

现在在控制台:
打印:obj1.name
生成:sunny

可正常计算的范围:前16位、后16位。

发布了49 篇原创文章 · 获赞 30 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/Reagan_/article/details/81258329