<script>
function Person(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
var ldh = new Person("liudehua", 26, "man");
//构造函数实例对象可以访问原型对象上公共的属性和方法。
//问题:1、实例对象不能修改原型对象上的属性和方法。
//2、命名冲突了,实例对象上的会覆盖原型对象。
Person.prototype.name = "nikkke";
console.log(Person.prototype);
console.log(ldh); //Person {name: "liudehua", age: 26, sex: "man"}
console.log(ldh.name); //liudehua
var zkf = new Person();
console.log(zkf); //Person {name: undefined, age: undefined, sex: undefined}
console.log(zkf.name); //undefined 命名冲突了直接到实例对象就不再往上追溯了
function Book() {}
Book.prototype.name = "战争与和平";
var book1 = new Book();
book1.name = "傲慢与偏见";
console.log(book1); //book {name: "傲慢与偏见"}
console.log(book1.name); //傲慢与偏见
// 使用delete操作符则可以完全删除实例属性,从而让我们能够重新访问原型中的属性
delete book1.name;
console.log(book1); //Book {}
console.log(book1.name);//战争与和平
var book2 = new Book();
console.log(book2); //Book {}
console.log(book2.name); //战争与和平
//使用hasOwnProperty()方法可以检测一个属性是存在于实例中,还是存在于原型中。
//这个方法(不要忘了它是从Object继承来的)只在给定属性存在于对象实例中时,才会返回true
function Mobile() {};
var iphone = new Mobile();
Mobile.prototype.age = "12";
iphone.name = "8plus";
iphone.age = '0'
console.log(iphone.age)
console.log(iphone.hasOwnProperty('name')) //true
console.log(iphone.hasOwnProperty('age')) //false
//in操作符会在通过对象能够访问给定属性时返回true,无论该属性存在于实例中还是原型中
console.log('age' in iphone) //true
console.log('name' in iphone) // true
//利用hasOwnProperty()和in判断属性属于实例还是原型
function handleProperty(obj,proper) {
return obj.hasOwnProperty(proper) && (proper in obj)
}
console.log(handleProperty(iphone,"age")) //true