prototype属性
<script>
// 任何函数 都有prototype属性
// 函数的prototype属性值 是一个对象 我们把这个对象叫做原型 也叫做原型对象
// 通过构造函数创建的实例对象,可以直接访问构造函数的prototype属性上的任意成员
function Person() {
console.log("hello")
}
// 给原型对象添加name属性
Person.prototype.name = "张三"
Person.prototype.sayHi = function (){
console.log("Hi")
}
console.log( Person.prototype)
var p1 = new Person()
console.log(p1.name)//张三
console.log(p1.__proto__)
var p2 = new Person()
console.log(p2.name)//张三
console.log(p1.sayHi ==p2.sayHi)//true
// 访问的是同一个
// 访问原型对象有两种方式
// 1.是通过构造函数来访问 构造函数的prototype 属性
// 2.通过实例对象来访问 实例对象的__proto__属性
console.log(Person.prototype ==p1.__proto__) //true
// 注意该属性是一个私有属性 不是标准的属性 ie上没有 不要在线上代码中用该属性,
// 本地开发中 可以使用该属性查看原型上有哪些成员可用
// 以__开头的都是私有属性,不希望 外部去修改
// 修改原型上的成员 也不推荐 这样做
p1.__proto__.color ="lime"
console.log(p1.__proto__.color)
// 通过构造函数去修改原型上的成员
Person.prototype.color = "red"
console.log(p1.__proto__)
// __proto__是对象上的属性
// prototype 是函数上的属性
// __proto__指向了原型
</script>
constructor属性
<script>
// constructor属性
// 原型对象中自带的属性
// 该属性值 指向了构造函数
function Person(){
}
console.log(Person.prototype.constructor)
// 构造函数通过prototype属性找到原型对象
// 原型对象通过constructor属性找到构造函数
// 构造函数通过new得到实例对象
// 实例对象不能直接找到构造函数
// 实例对象的__proto__属性找到了原型对象、
// 实例对象可以间接的通过原型对象的constructor属性找到构造函数
// 属性查找原则 自下而上
// 1.首先在对象自身上查找是否有该属性,如果有,返回该值。
// 2.如果没有,就去原型对象上找,如果有返回该值。
// 3,如果没有,就沿着原型链往上查找 到Object.prototype上 如果有返回结果
// 4.如果Object.prototype上也没有就返回 undefined
// 属性设置原则
// 1.如果对象没有该属性,就会对对象添加该属性
// 2.如果对象有该属性,就会修改对象原来的属性值
</script>