吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2672|回复: 1
收起左侧

[其他转载] 【笔记】深入理解Javascript面向对象编程一

[复制链接]
海军 发表于 2016-1-8 23:55
本帖最后由 奋斗丶小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()); //longen1

console.log(instance2.getName()); // longen2

原型具有普通对象结构,可以将任何普通对象设置为原型对象; 一般情况下,对象都继承与Object,也可以理解Object是所有对象的超类,Object是没有原型的,而构造函数拥有原型,因此实列化的对象也是Object的实列,如下代码:


// 实列化对象是构造函数的实列

console.log(instance1 instanceof A); //true

console.log(instance2 instanceof A); // true


// 实列化对象也是Object的实列

console.log(instance1 instanceof Object); //true

console.log(instance2 instanceof Object); //true


//Object 对象是所有对象的超类,因此构造函数也是Object的实列

console.log(A instanceof Object); // true


// 但是实列化对象 不是Function对象的实列 如下代码

console.log(instance1 instanceof Function); // false

console.log(instance2 instanceof Function); // false


// 但是Object与Function有关系 如下代码说明

console.log(Function instanceof Object);  // true

console.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);  //true

console.log(o instanceof Function);  // false

console.log(f instanceof Object);    // true

console.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


// 如果在本实列没有找到的话,到原型上查找也没有找到的话,就返回undefined

console.log(b1.a); // undefined


// 现在我使用delete运算符删除本地实列属性,那么取到的是就是原型属性了,如下代码:

delete b1.name;

console.log(b1.name); // AA


免费评分

参与人数 1热心值 +1 收起 理由
酱爆你个西瓜头 + 1 这学期刚结束这门课程!!!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

真爱贤 发表于 2016-1-9 08:48
感谢楼主分享~~支持楼主
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-9-23 05:14

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表