码迷,mamicode.com
首页 > 编程语言 > 详细

javascript原型模式(枚举对象的属性)

时间:2017-07-20 12:50:44      阅读:285      评论:0      收藏:0      [点我收藏+]

标签:修改   开发   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循环

javascript原型模式(枚举对象的属性)

标签:修改   开发   turn   typeof   原型模式   span   cti   eof   his   

原文地址:http://www.cnblogs.com/lqll/p/7210522.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!