类、构造函数、原型  :本质均为函数
利用的原理是:词法作用域,调用对象及作用域链  闭包  属性查找方式 
 
设计和new运算符一起使用的函数叫做构造函数。
构造函数的工作:初始化一个新创建的对象,设置在使用对象前需要设置的所有属性。
 
注:new创建一个新的没有任何属性的对象,然后调用该函数(调用对象),把此对象作为this关键字的值
传递给构造函数。
构造函数通常是没有返回值,只是为这个this设置属性,但一个构造函数是允许返回一个对象值的,
且如果这么做,返回的对象成为new表达式的值,作为this的值的对象会被抛弃。否则返回this这个对象。
 
原型和继承
一个对象的原型就是它的构造函数的prototype的值,所有的函数都有一个prototype属性,当其被定义时,prototype会自动创建
并初始化,prototype属性的初始化值是一个对象,这个对象只带有一个属性:constructor,它指回到和原型相关的那个构造函数(
这就是每个对象都有一个constructor属性的原因),
为prototype对象添加的任何属性,都会成为构造函数所初始化的对象的属性。
 
常规属性:在构造函数当中,使用this.属性  为其设置属性。方法也如此
继承属性:通过为构造函数的prototype添加属性。方法也如此
 
注:原型对象和构造 函数相关,并且,构造函数初始化的每个对象都确实从原型那里继承了完全相同的属性。
这意味着,原型对象是设置方法和其它不变属性的理想地方。
 
继承作为查找一个属性值的过程的一部分自动发生。
 
首先,使用原型对象可以显著地减少每个对象所需的内存。(因为常规属性存于每个实例当中,都有一份拷贝,但继承属性只有在原型对象当中保存了一部分,并且其它实例共享这份内存)
其次,即使在对象创建以后才添加到原型的属性,对象也可以继承它(得在查找该属性之前就已经添加,事实因为是词法作用域,所以只要定义了就能找到)
 
 
读取和写入继承的属性(通过实例对象)
 
由于一个原型对象可以被很多对象继承,JavaScript必须在读取和写入属性值 的时候,执行一种基本的不对称。
 
1、当读取实例 对象的属性的时候,JavaScript首先检查o是否有此属性,如果没有,它接下来检查此实例对象的原型对象是否有此属性。这使得基于原型的继承能够奏效。
 
2、当写入一个属性的值的时候,Javascript不会使用原型对象,只会为实例定义一个常规属性。
(因为如果使用原型对象添加这个属性,会让其他所有实例都有这个属性)
 
因此,属性继承只在读取属性值的时候发生,而当写入属性的时候不会发生。
 
由于 原型属性是由一个类的所有对象共享的属性,通常只用它们来定义对于类中的所有对象来说都相同的属性,才显得有意义。
这使得原型成为定义方法的理想工具。且如果改变这它,会影响到其它实例对象。
 
扩展内建类型
像String和Date  Function这样的内建的类,也是原型对象可对其扩展,
注:只能对核心的JavaScript的本地对象起作用,当JavaScript嵌入到其它环境中,如一个web浏览器,它就访问另外的
‘宿主对象’ ,如:Document,这些宿主对象一般没有构造函数和原型对象,所以无法扩展。
一般只有在实现缺少某个标准的方法时,才会扩展内建类型。用来实现兼容老版本等。
 
 
在JavaScript中模拟类
实例属性,实例方法
类属性,类方法
 
1、实例属性 实例方法
是那些由构造函数创建和初始化的属性和方法
 
放在构造函数中this创建的,以及放在prototype上定义的属性
 
2、类属性 类方法
类的每个属性 每个方法 都只有一份拷贝,(类本质也是一个对象(构造函数名))
类名.属性名=值;
 
3、私有属性(使用闭包来实现)
 
 
超类和子类   可多级继承
 
Object是所有内建为的超类。所有类都继承了Object的一些基本方法,
这意味着原型对象继承了Object.prototype属性,基于原型的继承并不限于一个单个的原型对象,相反它包含了
一个原型对象的链。
 
因此查找属性时路径:对象本身,超类.prototype对象,Object.prototype对象
 
 //类 构造函数  原型对象  this代表调用对象
function R(w, h) {
var date = new Date();
this.width = w;
this.height = h;
this.createtime = date.getFullYear() + "-" + date.getMonth() + "-" + date.getDay() + " " + date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds(); }
R.prototype.area = function () {
return this.width * this.height;
}
var o = new R(10, 20);
console.log(o.createtime + ":" + o.area());

输出:"2015-2-2 0:8:11:200"

 //类 构造函数  原型对象  this代表调用对象
function R(w, h) {
var date = new Date();
this.width = w;
this.height = h;
this.createtime = date.getFullYear() + "-" + date.getMonth() + "-" + date.getDay() + " " + date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds();
R.count++;
}
R.prototype.area = function () {
return this.width * this.height;
}
//以上创建的都是实例属性和实例方法,以下为类属性和类方法
R.count = 0;
R.getCount = function () {
return R.count;
} var o = new R(10, 20);
console.log("createtime:" + o.createtime + "\narea:" + o.area() + "\nR.count=" + R.getCount());
var o2 = new R(20, 30);
console.log("createtime:" + o2.createtime + "\narea:" + o2.area() + "\nR.count=" + R.getCount());

输出:
createtime:2015-2-2 0:9:14
area:200
R.count=1
createtime:2015-2-2 0:9:14
area:600
R.count=2

 //私有属性(只能通过专门的方法才能读取和写入),使用了闭包原理,因为里面定义的函数被外部的全局对象引用了,
//外部函数的调用对象不会被释放,w 和 h值一直维持最近一次的值,并且直到外部的引用消失,才会被释放内存
function R(w, h) {
this.getWidth = function () {
return w;
}
this.getHeight = function () {
return h;
}
this.setWidth = function (width) {
w = width;
}
this.setHeight = function (height) {
h = height;
}
}
var o = new R(10, 20);
alert(o.getWidth() * o.getHeight());
o.setWidth(100);
o.setHeight(200);
alert(o.getWidth() * o.getHeight());

输出:
200
20000

 

JavaScript 类、构造函数、原型的更多相关文章

  1. 对Javascript 类、原型链、继承的理解

    一.序言   和其他面向对象的语言(如Java)不同,Javascript语言对类的实现和继承的实现没有标准的定义,而是将这些交给了程序员,让程序员更加灵活地(当然刚开始也更加头疼)去定义类,实现继承 ...

  2. javascript类和原型学习笔记

    js中类的所有实例对象都从同一个原型对象上继承属性.我们可以自己写一个对象创建的工厂方法来来"模拟"这种继承行为: //inherit()返回一个继承自原型对象p的属性的性对象 / ...

  3. javascript 构造函数类和原型 prototyp e定义的属性和方法的区别

    1.把方法写在原型中比写在构造函数中消耗的内存更小,因为在内存中一个类的原型只有一个,写在原型中的行为可以被所有实例共享,实例化的时候并不会在实例的内存中再复制一份而写在类中的方法,实例化的时候会在每 ...

  4. JavaScript构造函数+原型创建对象,原型链+借用构造函数模式继承父类练习

    虽然经常说是做前端开发的,但常常使用的技术反而是JQuery比较多一点.在JavaScript的使用上相对而言少些.尤其是在创建对象使用原型链继承上面,在项目开发中很少用到.所以今天做个demo练习一 ...

  5. JavaScript提高篇之面向对象之单利模式工厂模型构造函数原型链模式

    1.单例模式 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  6. JavaScript中的 原型 property 构造函数 和实例对象之间的关系

    1 为什么要使用原型? /* * javascript当中 原型 prototype 对象 * * */ //首先引入 prototype的意义,为什么要使用这个对象 //先来写一个构造函数的面向对象 ...

  7. 深入理解Javascript中构造函数和原型对象的区别

    在 Javascript中prototype属性的详解 这篇文章中,详细介绍了构造函数的缺点以及原型(prototype),原型链(prototype chain),构造函数(constructor) ...

  8. JavaScript 类式继承与原型继承

    交叉着写Java和Javascript都有2年多了,今天来总结下自己所了解的Javascript类与继承. Javascript本身没有类似Java的面向对象的类与继承术语,但其基于原型对象的思想却可 ...

  9. javascript类继承系列二(原型链)

    原型链是采用最主要的继承方式,原理:每一个类(构造器,js中的function)都有一个原型属性(prototype)指向一个原型对象,原型对象有一个构造器(constructor),它又指回到fun ...

随机推荐

  1. 省队集训day6 A

    code: #include<cstdio> #include<iostream> #include<cmath> #include<cstring> ...

  2. 利用github for windows 工具将本地的内容同步到github上

    1 利用github for windows工具来创建一个Repository,名字叫weixin,具体步骤 请参考这篇文章 根据default storage directory的设置 我知道我所创 ...

  3. Win7主题被禁用

    今天早上干了一件傻缺的事,打开电脑的时候,某卫士提醒开机速度击败全国0.2%的电脑,之后点了优化...随后就发生了接下来的一幕: win7下面的主题都不能使用了,只能使用那种复古(很丑的样式,看着很不 ...

  4. 使用Windows 系统性能监控来报警磁盘空间不足

    http://blog.csdn.net/jiangxinyu/article/details/4370288

  5. COJ 0016 20603矩阵链乘

    传送门:http://oj.cnuschool.org.cn/oj/home/solution.htm?solutionID=35454 20603矩阵链乘 难度级别:B: 运行时间限制:1000ms ...

  6. Hive SQL运行状态监控(HiveSQLMonitor)

    引言   目前数据平台使用Hadoop构建,为了方便数据分析师的工作,使用Hive对Hadoop MapReduce任务进行封装,我们面对的不再是一个个的MR任务,而是一条条的SQL语句.数据平台内部 ...

  7. 关于开发板不能ping通外网IP

    最近在做远程监控的项目,打算用开发板给一个网站发送数据包.不过发现开发板只能ping通同一局域网内的ip,外网的ip不能ping通.纠结了半天发现是网关没有设置的原因.下面来说说如何解决这个问题. 首 ...

  8. Selenium webdriver 高级应用

    对于这一段还蛮有感慨的,只想说,代码还是需要自己去敲的. 1. 改变用户代理 import org.junit.AfterClass; import org.junit.BeforeClass; im ...

  9. Ajax之 beforeSend和complete longind制作

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Consolas; min-height: 18.0px } p.p2 { margin: 0 ...

  10. java笔记7之录入

    1  为了让程序的数据更符合开发的数据,我们就加入了键盘录入.    让程序更灵活一下.        那么,我们如何实现键盘数据的录入呢?        A:导包            格式:   ...