海军 发表于 2016-1-8 23:55

【笔记】深入理解Javascript面向对象编程一

本帖最后由 奋斗丶小Z 于 2016-1-9 00:10 编辑

一:理解构造函数原型(prototype)机制prototype是javascript实现与管理继承的一种机制,也是面向对象的设计思想.构造函数的原型存储着引用对象的一个指针,该指针指向与一个原型对象,对象内部存储着函数的原始属性和方法;我们可以借助prototype属性,可以访问原型内部的属性和方法。
当构造函数被实列化后,所有的实例对象都可以访问构造函数的原型成员,如果在原型中声明一个成员,所有的实列方法都可以共享它,比如如下代码:
// 构造函数A 它的原型有一个getName方法function A(name){    this.name = name;}A.prototype.getName = function(){    return this.name;}// 实列化2次后 该2个实列都有原型getName方法;如下代码var instance1 = new A("longen1");var instance2 = new A("longen2");console.log(instance1.getName()); //longen1console.log(instance2.getName()); // longen2原型具有普通对象结构,可以将任何普通对象设置为原型对象; 一般情况下,对象都继承与Object,也可以理解Object是所有对象的超类,Object是没有原型的,而构造函数拥有原型,因此实列化的对象也是Object的实列,如下代码:
// 实列化对象是构造函数的实列console.log(instance1 instanceof A); //trueconsole.log(instance2 instanceof A); // true
// 实列化对象也是Object的实列console.log(instance1 instanceof Object); //trueconsole.log(instance2 instanceof Object); //true
//Object 对象是所有对象的超类,因此构造函数也是Object的实列console.log(A instanceof Object); // true
// 但是实列化对象 不是Function对象的实列 如下代码console.log(instance1 instanceof Function); // falseconsole.log(instance2 instanceof Function); // false
// 但是Object与Function有关系 如下代码说明console.log(Function instanceof Object);// trueconsole.log(Object instanceof Function);// true如上代码,Function是Object的实列,也可以是Object也是Function的实列;他们是2个不同的构造器,我们继续看如下代码:
var f = new Function();var o = new Object();console.log("------------"); console.log(f instanceof Function);//trueconsole.log(o instanceof Function);// falseconsole.log(f instanceof Object);    // trueconsole.log(o instanceof Object);   // true我们明白,在原型上增加成员属性或者方法的话,它被所有的实列化对象所共享属性和方法,但是如果实列化对象有和原型相同的成员成员名字的话,那么它取到的成员是本实列化对象,如果本实列对象中没有的话,那么它会到原型中去查找该成员,如果原型找到就返回,否则的会返回undefined,如下代码测试function B(){    this.name = "longen2";}B.prototype.name = "AA";B.prototype.getName = function(){    return this.name;};
var b1 = new B();// 在本实列查找,找到就返回,否则到原型查找console.log(b1.name); // longen2
// 在本实列没有找到该方法,就到原型去查找console.log(b1.getName());//longen2
// 如果在本实列没有找到的话,到原型上查找也没有找到的话,就返回undefinedconsole.log(b1.a); // undefined
// 现在我使用delete运算符删除本地实列属性,那么取到的是就是原型属性了,如下代码:delete b1.name;console.log(b1.name); // AA

真爱贤 发表于 2016-1-9 08:48

感谢楼主分享~~支持楼主
页: [1]
查看完整版本: 【笔记】深入理解Javascript面向对象编程一