实例
<script>
//in 关键字用来寻找属性或方法是否在对象中写法:属性 in obj
/* var person = {
name: "张三",
age: 23,
gender: "male",
eat: function(){
console.log(this.name+"is eating");
}
}
//使用in来遍历对象中的所有属性
for(var key in person){
console.log(key + "="+person[key]);
}
var animal = {
species: "human",
hapti: "land",
sleeping: function(){
console.log("sleeping");
}
}
person.__proto__ = animal;
console.log(person.species);
for(var key in person){
//这里会将该对象的原型上的属性和方法也打印出来
console.log(key + "="+person[key]);
}
//-------obj.hasOwnProperty(key):判断key否是直接是obj的属性或方法,而不是原型上的
//alert(person.hasOwnProperty("species"));
//以下方法会遍历出对象中的所有自己的属性和方法
for(var key in person){
if(person.hasOwnProperty(key)){
console.log(key + "="+person[key]);
}
}
//以下方法会遍历出对象中的原型的属性和方法
for(var key in person){
if(!person.hasOwnProperty(key)){
console.log(key + "="+person[key]);
}
}
//in本质上也是一个运算符,左侧是属性名,右侧是对象,运算结果为如果该属性在对象(或原型)中则返回true,否则返回false
document.write("species" in person);*/
//----------constructor:是对象原型上的一个属性,该属性指向的是构造该对象的构造函数
function Person(name, age){
this.name = name;
this.age = age;
this.eat = function(){
console.log(this.name+" is eating");
}
}
var p1 = new Person("john", 23);
console.log(p1);
//使用constructor:是对象原型上的一个属性,该属性指向的是构造该对象的构造函数
/*function Animal(){
this.name = name;
this.age = age;
this.sleep = function(){
console.log(this.name+" is sleeping");
}
}
//将p1的constructor目标指向Animal
p1.__proto__.constructor = Animal;
console.log(p1);
p1.sleep();//这里会报错*/
/*var p2 = new Person("张三",44);
p1.__proto__.constructor.prototype.sleep = function(){
console.log(this.name + " is sleeping");
}//Person.prototype.sleep是一模一样的
p1.sleep();
p2.sleep();*/
//------------------Object.create方法
//Object.create(对象,null),实现继承
//对象1 = Object.create(对象2) 表示对象1中的原型就是对象2
var p2 = Object.create(p1);
console.log(p2);
var obj = Object.create(null);//这里将定义一个真正的空对象,连原型也没有
var obj2 = {}
console.log(obj,obj2)
document.write("obj2"+obj2);
document.write("obj"+obj);//这里会报错,因为obj里没有原型,也就不能继承object中的tostring方法
</script>