由于Js的灵活以及它和其他面向对象语言设计方式的差异,导致用一般面向对象语言的方式很难理解它,这篇文章就从三句话来了解Js。我称之为“3E箴言”。
Everything is a value
Every value is built by function
Every function has a prototype property
一、Everything is a value
在Js的世界里面,一切都是值。为什么这个很重要,我觉得这是Js区别于像Java这样的面向对象语言的最根本的因素。
在Java中,就不是一切都是值,特别是有两个重要的元素它们不是值,一个是Class,一个是method。
Class提供的是一个实例的构造蓝图,一个Class的实例是完全按照这个Class绘制的蓝图构造出来的,不容有误。Class不是值,所以Class不能作为method参数,不能作为method返回值,不能赋予给其他的变量。
但是在Js中,没有Class的概念,没有蓝图。只有function,而且function是一个值。我们知道function是唯一构造对象的,可以看做是一个class(当然和class有本质的区别),也是一个method。所以在Js中,可以看做为“class”和method都是值,这就造就了Js极其灵活的基因。
当然了,除了function之外,其他一切数据也都是值。详情参见
二、Every value is built by function
在Js语言中,所有的值都是有function构建而来,这一点非常重要。这是保证了这么灵活的语言不至于紊乱的重要因素。虽然Js提供了诸多的字面量的方式创建value,但是本质上这些字面量的背后也都是由function构建而来的。
// number type function
function Number(value) {}
let n = new Number(0); let n = 0;
// string type function
function String(value) {}
let s = new String('String'); let s = "String";
// boolean type function
function Boolean(value) {}
let b = new Boolean(true); let b = true;
// object type function
function Object(value) {}
let o = new Object({}); let o = {};
// function type function
function Function() {}
let f = new Function('a', 'b', 'return a + b');
let f = function(a, b) {
return a + b;
};
让所有的值都是有function构建而来有显而易见的好处,就是对所有的值方便管理,比如都能继承Object,比如都有统一的某些属性。
三、Every function has a prototype property
在Js中,所有的function都有一个prototype属性,这是Js实现继承的标准所在。我们知道所有的值都是由function构建而来,所以在通过new关键字创建值得时候,创建出来的值的__proto__都指向了该function的prototype属性,这就构成了Js的原型链。
我们知道,function本身也有值,function是由名字叫Function的function构建而来的。所以所有function的__proto__都指向Function.prototype,我们又知道,Object是一个function,Number是一个function… 当然,Function本身也是一个function。
Object.__proto__ ==== Function.prototype;
Object instanceof Function;
Number.__proto__ ==== Function.prototype;
Number instanceof Function;
Function.__proto__ ==== Function.prototype;
Function instanceof Function;
所以,我们可以这样给一些function添加方法。
Function.prototype.method = function(funcName, func) {
if (!this.prototype[funcName]) {
this.prototype[funcName] = func;
}
};
// 给所有的function添加xxoo的方法
Function.method('xooo', function() {
console.log('wow!');
});
var xxoo = function() {};
xxoo.xooo();
// 给所有string添加trim方法
String.method('_trim_', function() {
return this.replace(/^\s+|\s$/g, '');
});
' xxoo '._trim_() === 'xxoo';
认识Js的原型链是认识Js语言设计哲学的关键。
这篇文章算是简单的对之前关于Js的所有文章的总结,也是对Js语言的设计原理做一个简单的总结。
- JavaScript-prototype 到底是个什么鬼
- JavaScript-值与对象
- JavaScript-难道这都算继承?
- JavaScript-Object property’s properties
-