Javascript中的原型

原型

首先可以通过__proto__属性来查看对象的原型是什么,

那么这个对象的原型怎么来的,通过构造函数上的prototype属性来定义,
普通对象是没有prototype属性的

需要特别分清楚的是:一个对象的原型不等于自己的prototype属性,而是等于它的构造函数的prototype属性,很长时间,我对这个概念的理解是混乱的,上代码说明

首先要确定哪些东西是语言定义的,(或者说是说死的,不要问为什么)
prototype

而哪些东西是根据语法规则产生的

Function类型对象:

有prototype属性,他的prototype属性默认是

1
2
constructor: 他自己
__proto__: Object对象

比如:

1
2
3
4
5
6
7
8
9
10
11
function A() {}

// 其实等价于

var A = new Function();

// constructor: A()
// __proto__: Object

// 那么 A.__proto__ === Function.prototype === function() {}
// A.prototype ===

Object对象本身是个Function类型对象,他是有prototype属性的,而prototype属性上挂的属性和方法就会???

1
a.__proto__ === obj.constructor.prototype === A.prototype

Object类型对象 全都是通过构造函数生成的,他是有原型的,但是没有prototype属性

function A() {}

var a = new A();

由于JavaScript的所有对象都是通过构造函数生成的,而所有构造函数都有prototype属性(其实是所有函数都有prototype属性),所以所有对象都有自己的prototype原型对象。

因此,一个对象的属性和方法,有可能是定义它自身上面,也有可能定义在它的原型对象上面。由于原型本身也是对象,又有自己的原型,所以形成了一条原型链(prototype chain)。

比如,a对象是b对象的原型,b对象是c对象的原型,以此类推。

因为追根溯源,

最源头的对象都是从Object构造函数生成(使用new Object()命令),
所以如果一层层地上溯,所有对象的原型最终都可以上溯到Object.prototype。
那么,Object.prototype有没有原型呢?
回答可以是有,也可以是没有,
因为Object.prototype的原型是没有任何属性和方法的null。

Object.prototype对象的原型是null,由于null没有任何属性,所以原型链到此为止。

1
2
3
4
Object.getPrototypeOf  ();
var obj = new Object();
 obj.constructor.prototype === Object.getPrototypeOf(obj)
//结果:true

最简单的情况:一个对象的原型是在其构造函数的prototype属性上


妈蛋!!!
好乱啊

2016-03-09

Javascript中的new关键字

new的本质

执行构造函数,返回实例对象

  1. 创建一个空对象,作为将要返回的对象实例
  2. 将这个空对象的原型,指向构造函数的prototype属性
  3. 将这个空对象赋值给函数内部的this关键字
  4. 开始执行构造函数内部的代码

根据这几步可以模拟写一个和new命令一样功能的方法出来

2016-03-09

CSS学习笔记

CSS代码风格

声明顺序

相关的属性声明应该以下面的顺序分组处理:

  1. Positioning
  2. Box model 盒模型
  3. Typographic 排版
  4. Visual 外观

Positioning 处在第一位,因为他可以使一个元素脱离正常文本流,并且覆盖盒模型相关的样式。盒模型紧跟其后,因为他决定了一个组件的大小和位置。

其他属性只在组件 内部 起作用或者不会对前面两种情况的结果产生影响,所以他们排在后面。

2016-03-09

C语言学习笔记

Linux命令相关

ls -l出来的文件列表,最前面的d代表着这是一个文件夹

文件夹d 创建者权限rwx 创建者所在用户组权限rwx 其他人r-x
drw-rw-r–
-rwxrwxr-w

echo: 输出
echo $? :输出上一条命令的返回值

touch xxx,新建一个文件

cat 预览文本文件

| Linux管道

grep xxx:过滤出包含xxx的结果

ps: 查看进程
例如:ps -e | grep ssh 查看ssh的进程

2016-03-09

Javascript中的构造函数

构造函数

长久以来,我一直觉得js中是不存在类,其实js只是没有class或者说class关键字(当然ES2015也有了),没有class不代表没有类,面向对象语言怎么可能没有类呢,先通过代码来看看js中的类:

1
2
3
4
5
6
7
function Range(from, to) {
this.from = from,
this.to = to;
this.getLength = function() {
console.log('length:', this.to - this.from);
}
}

类的实例对象:

1
2
var r = new Range(2 , 8);
r.getLength(); // length: 6

2016-02-12