***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出来的实例对象