JavaScript函数高级(三)之原型链属性问题

***1、读取对象的属性值时:
会自动到原型链中查找
***2、设置对象的属性值时:
不会查找原型链,如果当前对象中没有此属性,直接添加此属性并设置其值
***3、方法一般定义在原型中;
属性一般通过构造函数定义在对象本身上
4、
一般情况下,不会在原型上添加属性。
每个对象都有自己的属性。


实例1:

function Fn() {}

    Fn.prototype.a = "xxx";//随便写的,无意义
    var fn1 = new Fn();
    console.log(fn1.a, fn1);//xxx
    /*
    fn1
    *  Fn {}
    *  __proto__: Object

   
   

实例2:

 * **/
    var fn2 = new Fn();
    fn2.a = "yyy";//如果这句注释;fn2.a在本身是查找不到a的,就会去原型链上查找,
                  // 这时就会自动添加原型__proto__,并赋值
    console.log(fn1.a, fn2.a, fn2);//xxx
    /*
    * fn2:
    * ->Fn {a: "yyy"}
a: "yyy"
__proto__:
a: "xxx"
constructor: ƒ Fn()
__proto__: Object
    * */


实例3

 function Person(name, age) {
        this.name = name;
        this.age = age;
    }

    Person.prototype.setName = function (name) {
        this.name = name;
    }
    Person.prototype.getName = function (name) {
        return this.name;
    }
    var p1 = new Person('Tom', 29);
    var p2 = new Person();
    console.log(p1.name);//Tom
    p1.setName('Hono');
    console.log(p1.name);//Hono
    p2.setName('Bob');
    console.log(p2.getName());//Bob
    console.log(p1);//方法在原型
    /*
    * Person {name: "Hono", age: 29}
age: 29
name: "Hono"
__proto__:
getName: ƒ (name)
setName: ƒ (name)
constructor: ƒ Person(name, age)
__proto__: Object
    * */

    var p3 = new Person('Jk', 29);
    p3.setName('Jack');
    console.log(p3.name);//Hono
    console.log(p1.__proto__ === p3.__proto__);//true
    console.log(p1.__proto__ === p2.__proto__);//true

注:p1.proto === p3.__proto__是正确的,因为p1和p2都是通过Person构造函数new出来的实例对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值