prototype 属性

prototype 属性是一个对象,包含应该由特定引用类型的实例共享的属性和方法。实际上,这个对象就是通过调用构造函数创建的对象的原型。

使用原型对象的好处:在它上面定义的属性和方法可以被对象实例共享。

使用构造函数
function Person(name, age, job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = sayName;
}
function sayName() {
console.log(this.name);
}
let person1 = new Person("zhangsan", 29, "Software Engineer");
let person2 = new Person("lisi", 27, "Doctor");
person1.sayName(); // zhangsan
person2.sayName(); // lisi
使用原型
function Person() {}
Person.prototype.name = "zhangsan";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
Person.prototype.sayName = function() {
console.log(this.name);
};
let person1 = new Person();
person1.sayName(); // "zhangsan"
let person2 = new Person();
person2.sayName(); // "zhangsan"
console.log(person1.sayName == person2.sayName); // true

Firefox、Safari 和Chrome会在每个对象上暴露__proto__属性,通过这个属性可以访问对象的原型。

注意:Person.prototype 指向原型对象,而erson.prototype.contructor 指回Person 构造函数。原型对象包含constructor 属性和其他后来添加的属性。

isPrototypeOf() 方法

isPrototypeOf()是Object 的原型方法(也称实例方法),它定义在Object.prototype 对象之上,所有 Object 的实例对象都会继承 isPrototypeOf() 方法。
isPrototypeOf() 方法用来检测一个对象是否存在于另一个对象的原型链中,如果存在就返回 true,否则就返回 false。
语法格式:prototypeObject.isPrototypeOf(object);
参数说明:object参数是Object类型的一个对象,将对其原型链进行检查。

function Person() {} //声明Person对象
let person1 = new Person(), //创建Person实例person1
person2 = new Person(); //创建Person实例person2
console.log(Person.prototype.isPrototypeOf(person1)); // true
console.log(Person.prototype.isPrototypeOf(person2)); // true

getPrototypeOf()

作用:⽤来得到某个对象的原型对象的标准⽅法。
返回:传入对象的原型对象

function Person() {} //声明Person对象
let person1 = new Person(), //创建Person实例person1
person2 = new Person(); //创建Person实例person2
Person.prototype.name = "zhangsan";
console.log(Object.getPrototypeOf(person1) == Person.prototype); // true
console.log(Object.getPrototypeOf(person1).name); // zhangsan 取得原型上的名字
console.log(Object.getPrototypeOf(person2).name); // zhangsan 取得原型上的名字

原型层级

在通过对象访问属性时,会按照这个属性的名称开始搜索。搜索开始于对象实例本身。
如果在这个实例上发现了给定的名称,则返回该名称对应的值。
如果没有找到这个属性,则搜索会沿着指针进入原型对象,然后在原型对象上找到属性后,再返回对应的值。

function Person() {} //声明Person对象
let person1 = new Person(), //创建Person实例person1
person2 = new Person(); //创建Person实例person2
Person.prototype.name = "zhangsan";
person2.name="lisi";
console.log(Object.getPrototypeOf(person1) == Person.prototype); // true
console.log(Object.getPrototypeOf(person1).name); // zhangsan 取得原型上的名字
console.log(Object.getPrototypeOf(person2).name); // zhangsan 取得原型上的名字
console.log(person1.name); // zhangsan 来自对象原型=》通过对象访问name属性,先查找对象实例本身,没有找到,后查找原型对象,找到后返回
console.log(person2.name); // lisi 来自对象实例=》通过对象访问name属性,先查找对象实例本身,找到后直接返回

hasOwnProperty()

作用:查看访问的是实例属性还是原型属性。
返回:实例属性返回true,原型属性返回false。

function Person() {}
Person.prototype.name = "zhangsan";
let person1 = new Person();
let person2 = new Person();
console.log(person1.name); // "zhangsan",来自原型
console.log(person1.hasOwnProperty("name")); // false
person1.name = "lisi";
console.log(person1.name); // "lisi",来自实例
console.log(person1.hasOwnProperty("name")); // true
posted on 2022-04-14 14:08  飞飞乐园  阅读(23)  评论(0编辑  收藏  举报