关于__proto__(左右都是2个_)和prototype的一些认识

关于__proto__(左右都是2个_)和prototype的一些认识

I._proto_:

1.这个属性是实例对象(子)的属性,每个实例对象都有一个__proto__属性,这个属性指向实例化该实例的构造函数(包含能从父里继承到的属性和方法)的原型对象(prototype)。
2.因为实例中有__proto__属性所以每个实例就能直接调用构造函数中prototype里的属性乃至方法(因为这些属性和方法都被复制进实例的__proto__中),但是对于同名属性或者方法,实例是覆盖构造函数的[或者说优先级实例>构造函数]。原理见下3.
3.当访问一个对象的属性时,如果该对象内部不存在这个属性,那么就会去它的__proto__属性所指向的那个对象(父的prototype)里找,如果父对象也不存在这个属性,则继续往父对象的__proto__属性所指向的那个对象(爷爷的prototype)里找,如果还没找到,则继续往上找…直到原型链顶端null,此时若还没找到,则返回undefined。

图例:
在这里插入图片描述
II.prototype:

1.每个构造函数都有一个prototype对象,这个对象指向该构造函数的原型(父)。

例子1:

function human(){
    this.age = 12;//构造方法里面的age属性
    this.chat = function(){//构造方法里面的showMsg方法
    	console.log("卢本伟牛逼");
    }
}
human.prototype.say = function () {//实例方法上定义的say方法
   	console.log('test');
}
human.prototype.age = 23;//原型上定义的age属性
var b = new human();//实例化一个human,
					//此时b对象包含了human构造函数中的属性和方法,不包含human原型上的属性和方法。

console.log(b);
b.chat();
b.say();
console.log(b.age)

结果:
在这里插入图片描述
1.console.log(b):age、chat从构造方法里继承;_proto_:age、say(后续在prototype中添加)。
2.b.chat();实例可调用构造方法里的chat()。
3.b.say():如上述(__proto__3.)所述,b实例中无say()方法,则通过__proto__从父对象的prototype中找到say()方法。
4.console.log(b.age):原理同上3.,b实例中有age属性,所以不通过__proto__找age属性。

例子2:

function human(){
    this.age = 12;//构造方法里面的age属性
    this.chat = function(){//构造方法里面的showMsg方法
    	console.log("卢本伟牛逼");
    }
}
human.prototype.say = function () {//实例方法上定义的say方法
   	console.log('test');
}
human.prototype.age = 23;//原型上定义的age属性
var b = new human();//实例化一个human,
					//此时b对象包含了human构造函数中的属性和方法,不包含human原型上的属性和方法。
function man(){};//初始化一个新构造方法man
man.prototype=b;//把man的原型指向实例化的b,即man的原型中就具备了b对象所有的属性和方法
var a = new man();//实例化一个man,

console.log(a)

结果:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
prototype和__proto__都与JavaScript中的原型链相关。 1. prototype一个函数特有的属性,它指向一个对象,该对象是使用该函数作为构造函数创建的所有实例的原型。通过原型链实例可以访问构造函数的原型中定义的属性和方法。 例如,我们有一个构造函数Person: ```javascript function Person(name) { this.name = name; } Person.prototype.sayHello = function() { console.log('Hello, ' + this.name + '!'); }; var person1 = new Person('Alice'); person1.sayHello(); // 输出 "Hello, Alice!" ``` 在上面的例子中,Person.prototype一个对象,它包含了我们想要共享给所有Person实例属性和方法。 2. __proto__是每个对象都有的属性,它指向该对象的原型。通过__proto__,对象可以访问自己的原型中定义的属性和方法。 例如,我们再使用上面的Person构造函数创建一个person2对象: ```javascript var person2 = new Person('Bob'); person2.sayHello(); // 输出 "Hello, Bob!" ``` 在上面的例子中,person2.__proto__指向Person.prototype,这样person2就可以调用Person.prototype中定义的sayHello方法。 虽然__proto__属性在现代JavaScript中已经被废弃,但仍然可以在一些老旧的浏览器和环境中使用。推荐使用Object.getPrototypeOf()来获取对象的原型,例如: ```javascript var proto = Object.getPrototypeOf(person2); proto === Person.prototype; // true ``` 总结:prototype是构造函数的属性,指向构造函数的原型对象;而__proto__是每个对象都有的属性,指向该对象的原型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值