原文地址 https://www.cnblogs.com/wangfupeng1988/p/3977987.html
一切(引用类型)都是对象,对象是属性的集合。
对象都是通过函数创建的
一、 typeof 和 instanceof
function show(x) {
console.log(typeof x); // undefined
console.log(typeof 10); // number
console.log(typeof 'abc'); // string
console.log(typeof true); // boolean
console.log(typeof function () {}); //function
console.log(typeof [1, 'a', true]); //object
console.log(typeof { a: 10, b: 20 }); //object
console.log(typeof null); //object
console.log(typeof new Number(10)); //object
}
show();
以上代码列出了typeof输出的集中类型标识,其中上面的四种(undefined, number, string, boolean)属于简单的值类型,不是对象。
剩下的几种情况——函数、数组、对象、null、new Number(10)都是对象。他们都是引用类型。
判断一个变量是不是对象非常简单。值类型的类型判断用typeof,引用类型的类型判断用instanceof。
var fn = function () { };
console.log(fn instanceof Object); // true
二、对象->若干属性的集合(死背)
javascript中数组是对象,函数是对象,对象还是对象。对象里面的一切都是属性,只有属性,没有方法。那么方法如何表示呢?——方法也是一种属性。表示为键值对的形式。
![](https://img.haomeiwen.com/i12858847/032aa2f50620e7cd.png)
而且javascript中的对象可以任意的扩展属性,没有约束。
以上代码中,obj是一个自定义的对象,其中a、b、c就是它的属性,而且在c的属性值还是一个对象,它又有name、year两个属性。
问题:函数和数组也是对象,他们也可以定义属性吗?当然不行,但是它可以用另一种形式,总之函数/数组之流,只要是对象,它就是属性的集合。
以函数为例:
var fn = function () {
alert(100);
};
fn.a = 10;
fn.b = function () {
alert(123);
};
fn.c = {
name: "王福朋",
year: 1988
};
上段代码中,函数就作为对象被赋值了a、b、c三个属性——很明显,这就是属性的集合。
在jQuery源码中,“jQuery”或者“$”,这个变量其实是一个函数。
console.log(typeof $); // function
console.log($.trim(" ABC "));
" jquery "的确是个函数。那么咱们常用的 “doller.trim() ”也是个函数。很明显,这就是在$或者jQuery函数上加了一个trim属性,属性值是函数,作用是截取前后空格。
——————————————————————
三、对象都是通过函数创建的
看个栗子
function Fn() {
this.name = '王福朋';
this.year = 1988;
}
var fn1 = new Fn();
fn1.name = '王福朋'
fn1.year = 1988
我们平时所创建的对象或者数组
var obj = { a: 10, b: 20 };
var arr = [5, 'x', true];
其实代码的本质是:
//var obj = { a: 10, b: 20 };
//var arr = [5, 'x', true];
var obj = new Object();
obj.a = 10;
obj.b = 20;
var arr = new Array();
arr[0] = 5;
arr[1] = 'x';
arr[2] = true;
而其中的 Object 和 Array 都是函数:
console.log(typeof (Object)); // function
console.log(typeof (Array)); // function
所以说,对象都是通过函数来创建的
————————————————————
四、--prototype原型
函数也是一种对象。他也是属性的集合,我们可以对函数进行自定义属性。
不用等咱们去试验,javascript自己就先做了表率,人家就默认的给函数一个属性——prototype。对,每个函数都有一个属性叫做prototype。
这个prototype的属性值是一个对象(属性的集合,再次强调!),默认的只有一个叫做constructor的属性,指向这个函数本身。
你也可以在自己自定义的方法的prototype中新增自己的属性
function Fn() { }
Fn.prototype.name = '王福朋';
Fn.prototype.getYear = function () {
return 1988;
};
这样就成了
![](https://img.haomeiwen.com/i12858847/600c97bc372c9b30.png)
代码演示:
function Fn() { }
Fn.prototype.name = '王福朋';
Fn.prototype.getYear = function () {
return 1988;
};
var fn = new Fn();
console.log(fn.name);
console.log(fn.getYear());
即,Fn是一个函数,fn对象是从Fn函数new出来的,这样fn对象就可以调用Fn.prototype中的属性。
因为每个对象都有一个隐藏的属性——“proto”,这个属性引用了创建这个对象的函数的prototype。即:fn.proto === Fn.prototype
网友评论