12、修改原型
大部分情况下,我们是不需要修改原型对象
注意:
千万不要通过类的实例去修改原型
1. 通过一个对象影响所有同类对象,这么做不合适
2. 修改原型先得创建实例,麻烦
3. 危险
处理通过__proto__能访问对象的原型外,
还可以通过类的prototype属性,来访问实例的原型
修改原型时,最好通过通过类去修改
好处:
- 一修改就是修改所有实例的原型
- 无需创建实例即可完成对类的修改
原则:
- 原型尽量不要手动改
- 要改也不要通过实例对象去改
- 通过 类.prototype 属性去修改
- 最好不要直接给prototype去赋值
<script>
class Person {
name = '孙悟空'
age = 18
sayHello(){
console.log('Hello,我是')
}
}
Person.prototype.fly = () => {
console.log('我在飞!')
}
class Dog {
}
const p = new Person ()
const p2 = new Person ()
// 通过对象修改原型,向原型中添加方法,修改后所有同类实例都能访问该方法 不要这么做!
// p.__proto__.run = () => {
// console.log('我在跑~')
// }
// p.__proto__ = new Dog() // 直接为对象赋值了一个新的原型 不要这么做!
// console.log(p)
// console.log(p2)
// p.run()
// p2.run()
// console.log(Person.prototype) // 访问Person实例的原型对象
</script>
13、instanceof和hasOwn
instanceof 用来检查一个对象是否是一个类的实例
- instanceof检查的是对象的原型链上是否有该类实例
只要原型链上有该类实例,就会返回true
- dog -> Animal的实例 -> Object实例 -> Object原型
- Object是所有对象的原型,所以任何和对象和Object进行instanceof运算都会返回true
in
- 使用in运算符检查属性时,无论属性在对象自身还是在原型中,都会返回true
对象.hasOwnProperty(属性名) (不推荐使用)
- 用来检查一个对象的自身是否含有某个属性
Object.hasOwn(对象, 属性名)
- 用来检查一个对象的自身是否含有某个属性
<script>
class Animal {}
class Dog extends Animal {}
const dog = new Dog()
// console.log(dog instanceof Dog) // true
// console.log(dog instanceof Animal) // true
// console.log(dog instanceof Object) // true
const obj = new Object()
// console.log(obj.__proto__)
// console.log(Object.prototype)
// dog.__proto__ / Dog.prototype
class Person {
name = "孙悟空"
age = 18
sayHello() {
console.log("Hello,我是", this.name)
}
}
const p = new Person()
// console.log("sayHello" in p)
// console.log(p.hasOwnProperty("sayHello"))
// console.log(p.__proto__.__proto__.hasOwnProperty("hasOwnProperty"))
console.log(Object.hasOwn(p, "sayHello"))
</script>