JavaScript 对象
JavaScript 对象是拥有属性和方法的数据
面向对象
- 面向对象仅仅是一个概念或者编程思想。
- 通过一种叫做原型的方式来实现面向对象编程。
创建对象
创建对象的方式(在这列举两种,其它在这不做过多解释)
- 使用内置对象
- 自定义对象构造
内置对象
常见的内置对象
- String(字符串)对象
- Date(日期)对象
- Array(数组)对象
- Boolean(逻辑)对象
- Math(算数)对象
- RegExp(正则表达式)对象
不做太多详细的解释。。。
自定义对象
基于 Object 对象的方式创建对象
语法
var 对象名称=new Object();//通过 .添加属性和方法
eg:
var flower=new Object();
flower.name="牡丹";
flower.showName=function(){
alert(this.name);
}
使用字面量赋值方式创建对象
语法
var 对象名称={
//写属性和方法
}
eg:
var flower={
name:"牡丹",
showName:function(){
alert(this.name);
}
}
构造函数
在 JavaScript中,任何合法的函数都可以作为对象的构造函数,这既包括系统内置函数,也包括用户自己定义的函数。一旦函数被作为构造函数执行,它内部的 this 属性将引用函数本身。
构造函数特点
- 构造函数始终都应该以一个大写字母开头
- 构造函数本身也是函数,只不过可以用来创建对象
- 创建构造函数的新实例,必须使用 new 操作符
示例
//创建构造函数
function Flower(name,area){
this.name=name;
this.area=area;
this.show=function(){
alert(this.name+" "+this.area);
}
}
//使用构造函数创建对象
var flower=new Flower("长春花","非洲、亚洲等");
flower.show();
调用构造函数的步骤
- 创建一个新对象
- 将构造函数的作用域赋给新对象(this 就指向了这个新对象)
- 执行构造函数中的代码
- 返回新对象
constructor 属性
constructor 属性指向构造函数
使用 instanceof 操作符检测对象类型
JavaScript 的原型和原型链
构造函数创建对象:
function Person(){
}
var person=new Person();
person.name="Kevin";
Console.log(person.name);//Kevin
Person 就是一个构造函数,我们使用 new 创建了一个实例对象 person
prototype
每个函数都有一个 prototype 属性
每一个 JavaScript 对象(null 除外),在创建的时候就会产生与之相关联的另一个对象,这个对象就是我们所说的原型,每一个对象都会从原型 “继承” 属性。
function Person(){
}
//虽然写在注释里,但是要注意
//prototype 是函数才会有的属性
Person.prototype.name="Kevin";
var person1=new Person();
var person2=new Person();
Console.log(person1.name);//Kevin
Console.log(person2.name);//Kevin
proto
每一个 JavaScript 对象(除了 null)都具有的一个属性,叫 proto,这个属性会指向该对象的原型。
function Person(){
}
var person=new Person();
Console.log(person._proro_ ==== Person.prototype);//true
constructor
每个原型都有一个 constructor 属性指向关联的构造函数
function Person(){
}
Console.log(Person === Person.prototype.constructor);//true
实例与原型
function Person(){
}
Person.prototype.name="Kevin";
var person=new Person();
person.name="Daisy";
Console.log(person.name);//Daisy
delete person.name;
Console.log(person.name);//Kevin
在这个例子中,我们给实例对象 person 添加了 name 属性,当我们打印 person.name 的时候,结果自然为 Daisy。
但是当我们删除了 person 的 name 属性时,读取person.name,从 person 对象中找不到 name 属性,就会从 person 的原型 person.proto,也就是Person.prototype 中查找,幸运的是我们找到了 name 属性,name值为Kevin。
原型与原型
var obj=new Object();
obj.name="Kevin";
Console.log(obj.name);//Kevin
原型链接
Console.log(Object.prototyoe._proto_ === null);//true
借用构造函数
apply
语法
apply([thisObj[,argArray]])
应用某一对象的一个方法,用另一个对象替换当前对象。
thisObj 被用作当前对象的对象。
第二个参数是一个数组,也就是将多个参数组合成为一个数组传入
call
语法
call([thisObj[,arg1[,arg2[,[,argN]]]]])
调用一个对象的一个方法,以另一个对象替换当前对象。
thisObj 被当作当前对象的对象。
arg1,arg2,…argN 为被传递方法参数序列。
优势
可以在子类型构造函数中向父类型构造函数传递函数。
组合继承
组合继承:有时也叫做伪经典继承
- 将原型链和借用构造函数的技术组合到一起,发挥两者之长的一种继承模式
- 使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承