使用hasOwnProperty()方法检测一个属性存在实例还是原形中,当属性存在对象实例中时,返回true

alert(person1.hasOwnProperty("name"));  //false 来自原型

原型和in操作符

单独使用和for-in中,单独使用时无论属性存在于实例中还是原型中都返回true

ECMAScript 5的Object.keys()方法,接收一个对象作为参数,返回一个包含所有可枚举属性的字符串数组(参数是实例则返回实例的属性,是原型则返回原型的属性)

var keys=Object.keys(Person.prototype);

alert(keys);  //"name,age,job,sayName"

得到所有实例属性,无论它是否可枚举用Object.getOwnPropertyNames()方法

var keys=Object.getOwnPropertyNames(Person.prototype);

alert(keys);

用一个包含所有属性和方法的对象字面量来重写整个原型对象

function Person(){};

Person.prototype={

    name:"Nicholas",

    age:29,

    job:"Software Engineer",

    sayName:function(){

      alert(this.name);

      }

};

因为我们完全重写了原型对象,因此它的constructor属性不再指向Person了,而是指向Object构造函数,此时通过constructor已经无法确定对象的类型了

var friend=new Person();

alert(friend instanceOf Object);  //true继承自Object

alert(friend instanceOf Person);  //true

alert(friend.constructor ==Person);  //false

alert(friend.constructor ==Object);  //true

如果constructor的值很重要
function Person(){}

Person.prototype={

    constructor:Person,

    name:"Nicholas"

    };  //注意,这样操作以后会导致它的[[Enumerable]]特性设置为true,变为可枚举属性

  //重写prototype

Person.prototype={

    name:"Nicholas",

    age:29

    };

  //添加prototype属性

Person.prototype.sayHi=function(){

  alert("hi");

};

由于原型的动态性,我们对原型的任何修改能在实例中反映出来

通过构造函数创建一个实例后,这个实例的[[Prototype]]指针指向最初原型,如果重写整个原型对象会切断这个实例与原型之间的联系,造成错误

原型模式的重要性不见体现在创建自定义类型方面,原生引用类型(Object、Array、String)等等都在其构造函数的原型上定义了方法

alert(typeof Array.prototype.sort);  //"function"

可以自定义方法

String.prototype.startsWith=function (text){

    return this.indexOf(text)==0;

};

var msg="hello world!";

alert(msg.startsWith("hello"));  //true

原型模式的共享是一个优点,却也是一个问题,假如我们通过实例修改原型那么另一个指向这个原型的实例也会反应出这样的修改

组合使用构造函数模式和原型模式,构造函数模式存私有属性,原型模式存共有属性

function Person(name,age,job){

    this.name=name;

    this.age=age;

    this.job=job;

    this.friend=["ShelBy","Court"];

    }

Person.prototype={

    constructor:Person,

    sayName:function(){

      alert(this.name);

        }

}

var person1=new Person("Nicholas",29,"Software Engineer");

var person2=new Person("Greg",27,"Doctor");

person1.friends.push("Van");

alert(person1.friends);  //"ShelBy,Court,Van"

alert(person2.friends);  //"ShelBy,Court"

动态原型模式

在构造函数中封装所有信息,后面再检测某个方法是否有效,无效的话再次添加到原型中

寄生构造函数模式

创建一个对象,封装对象的代码,返回新创建的对象,在调用本模式时加new操作符

稳妥构造函数

不引用this,不使用new调用构造函数,返回对象

最新文章

  1. MySQL TCL 整理
  2. HandlerThread
  3. 解决由OpenShift自带的APC加速器造成的代码无法及时生效的问题
  4. JavaWeb学习总结(二)——Tomcat服务器学习和使用(一)
  5. ansible管理
  6. MYSQL关于表的一些操作
  7. UIImage 缩放等效果处理
  8. ubuntu14.04下arm-linux-gcc 4.5.1的安装与配置
  9. ADO.net基础学习总结(二)
  10. java中四种操作xml方式的比较
  11. [iOS]详解调整UIButton的title和image的位置
  12. ACM-ICPC 2018 徐州赛区网络预赛 B BE, GE or NE(记忆化搜索)
  13. React文档(二十一)协调
  14. webapi自定义Filter
  15. 【练习】Python第四次:实现对文件的增删改查
  16. Windows7安装Bitvise开启ssh服务
  17. Nginx range filter模块数字错误漏洞修复 (Nginx平滑升级)
  18. struts2拦截器interceptor的配置方法及使用
  19. Apache2.4配置(全)
  20. Python - Django - ORM 实例(二)

热门文章

  1. getSharedPreferences()与getSharedPreferences()与getDefaultSharedPreferences()的区别
  2. o] TortoiseGit错误 - Could not get all refs. libgit2 returned: corrupted loose reference file
  3. Android占位符
  4. Sqlserver 列转行 行转列
  5. SQL打印全年日历
  6. ACM hdu 1019 Least Common Multiple
  7. 实现基于Memcache存储的Session类
  8. C++资源之不完全导引 (转载)
  9. Linux相关命令
  10. [BZOJ 3564] [SHOI2014] 信号增幅仪 【最小圆覆盖】