标签:修改 开发 turn typeof 原型模式 span cti eof his
1、理解原型对象
function Person() { } Person.prototype.name = "Nicholas"; Person.prototype.age = 28; Person.prototype.job = "Software Engineer"; Person.prototype.sayName = function () { alert(this.name); }; var person1 = new Person(); person1.sayName(); //Nicholas var person2 = new Person(); person2.sayName(); //Nicholas alert(person1.sayName() == person2.sayName()) //true
isPrototypeOf()方法的参数是实例对象,当原型对象调用isPrototypeOf()方法时可以确定原型对象与实例对象的关系
alert(Person.prototype.isPrototypeOf(person1)); //true alert(Person.prototype.isPrototypeOf(person2)); //true
Object.getPrototypeOf()方法用来取得对象的原型,参数是实例对象
alert(Object.getPrototypeOf(person1) == Person.prototype); //true alert(Object.getPrototypeOf(person1).name); //"Nicholas"
注!:当在实例中修改的属性或方法会覆盖原型中的属性和方法
hasOwnProperty()方法可以检测一个属性是否存在于实例中
function Person() {
}
Person.prototype.name = "Nicholas";
Person.prototype.age = 28;
Person.prototype.job = "Software Engineer";
Person.prototype.sayName = function () {
alert(this.name);
};
var person1 = new Person();
var person2 = new Person();
var dd= "dd"; alert(person1.hasOwnProperty("name")); //false alert(person1.hasOwnProperty("dd")); //false
//只有在实例上重写name属性后才返回true person1.name = "new"; alert(person1.hasOwnProperty("name")) //true
2、原型与in操作符:有两种方式使用in操作符,单独使用和在for-in循环中使用。在单独使用时,in操作符会在通过对象能够访问给定属性时返回true,无论该属性存在于实例中还是原型中。
a、使用in循环
function Person() { } Person.prototype.name = "Nicholas"; Person.prototype.age = 28; Person.prototype.job = "Software Engineer"; Person.prototype.sayName = function () { alert(this.name); }; var person1 = new Person(); var person2 = new Person(); alert(person1.hasOwnProperty("name")); //false alert("name" in person1); //true person1.name = "Greg"; alert(person1.name); //"Greg"--来自实例 alert(person1.hasOwnProperty("name")); //true alert("name" in person1) //true
同时使用hasOwnProperty()方法和in操作符,就可以确定该属性到底是存在于对象中,还是存在于原型中。
b、使用for-in循环:
在使用for-in循环时,返回的是所有能够通过对象访问的、可枚举的属性,其中既包括存在于实例中的属性,也包括存在于原型中的属性。屏蔽了原型中不可枚举属性的实例属性也会在for-in循环中返回,以为根据规定,所有开发人员定义的属性都是可枚举的。
var o = {
toString : function () {
return "My Object";
}
};
for (var prop in o){ if (prop == "toString"){ alert("Found toString"); } } alert(prop)
c、取得对象上所有可枚举的实例属性:Object.keys()
function Person() { } Person.prototype.name = "Nicholas"; Person.prototype.age = 28; Person.prototype.job = "Software Engineer"; Person.prototype.sayName = function () { alert(this.name); }; var keys = Object.keys(Person.prototype); alert(keys); //"name,age,job,sayName" var p1 = new Person(); p1.name = "Rob"; p1.age = 31; var p1keys = Object.keys(p1); alert(p1keys); //"name,age"
得到想要的所有属性,无论他是否可以枚举:Object.getOwnPropertyNames()
function Person() { } Person.prototype.name = "Nicholas"; Person.prototype.age = 28; Person.prototype.job = "Software Engineer"; Person.prototype.sayName = function () { alert(this.name); }; var person = new Person(); person.name = "dfas"; var keys = Object.getOwnPropertyNames(Person.prototype); alert(keys); //"constructor,name,age,job,sayName alert(Object.getOwnPropertyNames(person)) //name
Object.keys()和Object.getOwnPropertyNames()方法都可以用来代替for-in循环
标签:修改 开发 turn typeof 原型模式 span cti eof his
原文地址:http://www.cnblogs.com/lqll/p/7210522.html