<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