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

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循环

时间: 2024-08-30 10:29:21

javascript原型模式(枚举对象的属性)的相关文章

Javascript原型模式总结梳理

在大多数面向对象语言中,对象总是由类中实例化而来,类和对象的关系就像模具跟模件一样.Javascript中没有类的概念,就算ES6中引入的class也不过是一种语法糖,本质上还是利用原型实现.在原型编程语言中,类并不是必需的,对象不一定需要由类实例化而来,而是通过克隆另外一个对象来得到. 原型模式是用来创建对象的一种模式.在以类为中心的语言中,要创建一个对象首先要指定这个对象的类型,然后实例化一个对象.使用原型模式创建对象时不必关心对象的具体类型,而是找到一个对象,然后通过克隆来创建一个一模一样

Javascript:原型模式类继承

原型模式 每个函数(准确说不是类.对象)都有一个prototype属性,这个属性是一个指针,指向一个对象. 使用原型对象的好处是可以让所有对象实例共享它包含的属性和方法. 1.原型对象 (1)当创建一个新函数,就会为该函数创建一个prototype属性,这个属性指向函数的原型对象. (2)默认情况下,所有原型对象都会自动获得一个constructor(构造函数)属性,这个属性包含一个指向 prototype属性所在函数  的指针. (3)实例的内部包含一个指针,叫[[Prototype]].不过

JavaScript原型模式

一.提到原型模式,和构造函数关系密切,先讲一下它 javascript没有类,通过函数来模拟实现类,用new来创建对象,函数内部的this指针来指向调用它的对象. 事例中创建对象myGril,这个对象就获取了构造函数内this指向的所有属性和方法. var GirlFriend=function (temperament) { this.temperament=temperament; this.loseTemper=function(){ return "When angry:"+t

JavaScript中的window对象的属性和方法;JavaScript中如何选取文档元素

一.window对象的属性和方法 ①setTimeout()方法用来实现一个函数在指定毫秒之后运行,该方法返回一个值,这个值可以传递给clearTimeout()用于取消这个函数的执行. ②setInterval()用来实现一个在指定毫毛数的时间里重复调用,返回一个值,这               个值可以传递给clearInterval()用于取消后续函数的调用. ③Document对象的location属性也引用到Location对象: window.location === docume

javascript原型模式发展历程

// 工厂模式 function Person(name,age){ var o = new Object(); o.name=name; o.age=age; o.sayName=function(){ alert(o.name) } return o } var o1=Person('lele',5) var o2=Person('mama',31) // 构造函数模式(能够标识对象属于哪一种类型,但是函数没有复用) function Person(name,age){ this.name=

Javascript学习笔记:对象的属性类型

在ECMAScript中有两种属性:数据属性和访问器属性 1.数据属性 configurable:表示能否通过delete删除属性从而重新定义属性:或者能否修改属性的特性:或者能否把属性修改为访问器属性. enumerable:表示能否通过for-in循环返回属性. writable:表示能否修改属性的值. value:包含这个属性的数据值,读取属性的时候,从这个位置读:写入属性的时候,把新的值保存在这个位置. 2.访问器属性 configurable:表示能否通过delete删除属性从而重新定

三、单例模式之原型模式

原型模式:对象的属性的完全复制,包括基本类型属性和引用类型的对象的属性的安全复制. 复制的方式可划分为: 浅复制:一般通过clone实现,引用类型的属性复制的是引用,而不是新的对象.原型对象需要实现java.lang.Cloneable. 深复制: 可以通过手动进行set赋值,引用对象类型的属性,先创建该对象再赋值. 通过序列化的方式进行赋值.对象需要实现java.io.Serializable. 原文地址:https://www.cnblogs.com/kancy/p/10226970.htm

「JavaScript里的面向对象」— 5.原型模式

本文原文来源:<Object-Oriented JavaScript>By Stoyan Stefanov 本文翻译来源:赤石俊哉 原创翻译 版权申明: 如果您是原文的原作者并且不希望此文被公开,可以联系作者删除.本文翻译由 赤石俊哉 翻译整理,您可以用于学习目的,但是禁止转载. 第五章 原型模式(Prototype) 在这一章节中你将会学习使用"函数(function)"对象中的prototype属性.在JavaScript的学习过程中,理解prototype的工作原理是

JavaScript设计模式-3.原型模式

1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>js高级语法3-原型模式 </title> 6 </head> 7 <body> 8 <script> 9 /* 10 javascript原型模式(prototype): 11 1. 原型是一个对象,其他对象可以通过它实现属性的继承,所有的