我们所创建的每一个函数,解析器都会向函数中添加一个属性prototype,这个属性对应着一个对象,这个对象就是我们所谓的原型对象。
如果函数作为普通函数调用prototype没有任何作用,当函数以构造函数的形式调用时,它所创建的对象中都会有一个隐含的属性,指向该构造函数的原型对象,我们可以通过__proto__(两个下划线)来访问该属性。
原型对象就相当于一个公共区域,所以同一个类型的实例都可访问这个原型对象,我们可以将对象中共有的内容,同一设置到原型对象中。
当我们访问对象的一个属性或方法时,他会先在对象自身中寻找,如果有则直接使用
在这里插入图片描述
//原型
function MyClass(){
}
//向MyClass原型中添加属性a
MyClass.prototype.a = 123;
//向MyClass的原型中添加一个方法
// MyClass.prototype.sayHello = function(){
// alert("hello");
// }
var mc = new MyClass();
var mc2 = new MyClass();
console.log(MyClass.prototype);
console.log(mc2.__proto__ == MyClass.prototype);
//向mc中添加a属性
mc.a = "我是mc中的a";
//原型对象
function MyClass(){
}
//向MyClass中添加一个name的属性
MyClass.prototype.name = "我是原型中的名字";
var mc = new MyClass();
// console.log(mc.name);
//我是原型中的名字
mc.age = 18;
//使用in检查对象中是否含有某个属性时,如果对象中没有但原型中有,也会返回true
console.log("name" in mc);//true
//可以使用对象的hasOwnproperty()来检查对象自身中是否含有该属性
//使用该方法只有当对象自身中含有该属性时,才会返回true
console.log(mc.hasOwnProperty("name")); //false
console.log(mc.hasOwnProperty("age"));//true
原型对象也是对象,所以他也有原型
1.当我们使用一个对象属性或方法时,会先在自身中寻找
2.自身中如果有,则直接使用
3.如果没有则去原型中找,如果原型中有,则使用
4.如果没有,则去原型的原型中找,知道找到object对象的原型
5. object对象的原型没有原型,如果在Object中依然没有找到,则返回undefined
console.log(mc.__proto__.__proto__.hasOwnProperty("hasOwnProperty"));
//修改person原型的的toString
Person.prototype.toString = function(){
return"我是一只猪";
}
var obj = new Object();
obj.name = "猪猪";
索引:从0开始的整数就是索引
使用typeof检查数组时,会返回object
1.向数组中添加元素
语法:数组 [ 索引 ] = 值;
var arr = new Array();
arr[0] = 10;
2.读取数组中的元素
语法:数组 [ 索引 ];
console.log(arr[0]);
3.获取数组的长度 length属性
语法:数组.属性
console.log(arr.length);
连续的数组:length获取数组的长度
不连续的数组:length获取数组最大索引+1(尽量不要创建非连续数组)
4.修改length长度
arr.length = 10;
(1)如果修改的length大于原长度,则多出来的部分会空出来
(2)如果小于length原长度,则原数组多出的元素会被删除
5.向数组的最后一个位置添加元素
语法:数组[数组.length] = 值;
arr[arr.length] = 11;
使用字面量来创建数组,可以在创建时就指定数组中的元素
语法:[];
var arr = [1,2,3,4];
使用构造函数创建时,可以同时添加元素,将要添加的元素作为构造函数的传递
var arr = new Array(10,20,30);
创建一个数组中只有一个元素10
arr = [10];
创建一个长度为10 的数组(少用构造函数)
arr2 = new Array(10);
数组中的元素可以是任意的数组类型
arr = ["hello", 11, true, null, undefined];
也可以是对象
//也可以是对象
var obj = {
name:"猪猪"
};
arr[4] = obj;
//或
arr = [{name:"猪猪"},{name:"臭臭"}];
或一个函数
arr = [
function(){alert("1")},
function(){alert("2")},
];
//调用
arr[0]();
数组里也可以放数组 :二维数组
arr = [[1,2,3], [4,5,6], [7,8,9]];
向数组末尾添加一个或多个元素,并返回数组新的长度(length只可添加一个),该方法会将数组新的长度作为返回值返回
var arr = ["猪猪", "臭臭", "大臭臭"];
arr.push("笨笨");
console.log(arr);
删除数组的最后一个元素,并将删除的元素作为返回值返回
arr.pop();
向数组开头添加一个或多个元素,并返回新的数组长度,向前边插入元素以后,数组的其他元素的索引会依次调整
可以删除数组的第一个元素,并将删除的元素作为返回值返回