JS中的prototype和__proto__

prototype
在JS中,每一个函数都有一个prototype属性,它的作用,简单的理解,就是当使用new关键字实例化一个函数的时候,这个函数prototype里面的对象也会共享到新实例里面。

function M1(){
    name:'john'
}
M1.prototype.sex = 'male'
M1.age = 18
var m2 = new M1()
console.log(m2.name)//undefined
console.log(m2.sex)//male,因为sex在M1的prototype中,所以new出来的m2可以访问这个属性
console.log(m2.age)//undefined
其中,
M1.prototype.sex = 'male'

在M1的prototype属性中定义了sex,值是male,那么new M1()得到的实例m2,也具有了sex,并且值是male。
由于age属性没有定义在prototype上,所以m2无法访问。

M1.prototype.sex和M1.sex是不一样的,接着上面的代码:

proto
proto__是一个“指针”,它“指向”一个对象,上面的例子中,m2=new M1(),那么m2会自动具有__proto=M1.prototype。也可以手动修改__proto__,使它指向别的对象。

function M1(){
    name:'john'
}
var m2 = new M1()
m2.__proto__=M1
M1.sex = 'male'
console.log(m2.sex)//male

可以看到,sex直接定义在了M1上,而没在prototype中,m2仍然可以访问了。这是因为我们改写了__proto__,直接指向了M1对象。
__proto__不是js的标准规范里面的规定,各主流js引擎都支持,但不建议直接使用。

备注:
obj都有私有__proto__属性, 而函数是也是对象实例,所以函数也有__proto__

JavaScript 中,每个对象都有一个 __proto__ 属性,指向其构造函数的原型对象。而每个函数都有一个 prototype 属性,指向该函数实例化出来的对象的原型对象。 __proto__ 属性是一个指针,指向该对象的构造函数的原型对象。通过 __proto__ 属性可以访问原型对象中的属性方法。这个属性在 ES6 中已经被标准化,可以用 Object.getPrototypeOf() 来获取对象的原型。 prototype 属性是函数的一个特殊属性,指向一个对象。当函数用作构造函数创建实例对象时,该对象的原型会指向构造函数的 prototype 属性指向的对象。也就是说,该对象可以访问构造函数原型对象中的属性方法。 举个例子: ``` function Person(name) { this.name = name; } Person.prototype.sayHello = function() { console.log(`Hello, my name is ${this.name}`); } const p = new Person('Tom'); console.log(p.__proto__ === Person.prototype); // true console.log(Person.prototype.constructor === Person); // true console.log(p.constructor === Person); // true ``` 在这个例子中,我们定义了一个构造函数 `Person`,并给其原型对象添加了一个 `sayHello` 方法。我们通过 `new` 关键字实例化了一个 `Person` 对象 `p`。这个对象的 `__proto__` 属性指向了 `Person.prototype`,因此我们可以通过 `p.__proto__.sayHello()` 或者 `Person.prototype.sayHello.call(p)` 来调用 `sayHello` 方法。同时,我们也可以通过 `Person.prototype` 来访问 `Person` 构造函数原型对象中的属性方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值