明白javascript是如何创建对象的
通过字面量的方式
var obj = new Object();
var obj={};
//字面量
var a = {
name:”aName”,
age:18
};
var b= {
name:”bName”,
age:18
};2.工厂模式
//用函数的方式,创建对象
function createPerson(name, age) {
var o = new Object();
o.name=name;
o.age=age;
o.sayName=function () {
alert(this.name);
};
return o;
}
var person1=createPerson(“aaa”,18);
var person2=createPerson(“bbb”,18);3.构造函数创建对象
function create(name, age) {
this.name=name;
this.age=age;
}
var aa = new create(“does”,11);
一、原型链
Javascript原型链是ECMAScript实现继承过程中所产生的概念,学习javascript,就必须理解原型链的原理。
二、JAVA和Javascript继承区别
JAVA继承:
在一个类的基础上创建一个新类,extends
JAVASCRIPT继承:
在一个对象的基础上创建一个新的对象。原型则表示,原来基础上的对象
三、原型
如果我们通过字面量方法创建对象,比如我们创建一个Dog这个对象,这个对象中有eat()方法,则通过Dog.eat()调用即可,那如果我们再创建一个对象Cat,里面也有eat()方法,则也是通过Cat.eat(),那么问题来了,既然两个对象都有吃的方法,那么难道我们每次都需要在对象内写重复的eat()方法吗?显然不是的。因为同样的动作,我们可以共享其方法。贴上代码:
var animal={
name:"动物",
eat:function () {
console.log(this.name+" is eating")
}
};
var dog={
name:"dog",
__proto__:animal
};
var cat={
name:"cat",
__proto__:animal
};
dog.eat();
cat.eat();
因为cat和dog都是动物,动物细分为cat和dog,那么这就是对象,它们既然是动物所以共有吃的功能。
我们分别在dog和cat中加了__proto__
指针,值为animal
,所以dog和cat共享了eat()方法,所以,原型就为animal。
四、原型链讲解
通过上述代码可知道有__proto__
这指针,指向的是原型对象,所以dog和cat这两个对象都不需要写入eat方法,那原型链说的是,js首先通过判断自己内部是否有这方法,如果没有则往上找这个方法,形成一条链。所以叫原型链。好比拔河比赛,一根绳子中你想找超胖的人,从头找到尾,总能找到一个超胖的人,找打了则返回结果。
说到这里,我们知道什么是原型和原型链了。但是,还没结束。因为我们还需要知道一个东西,那就是prototype
这又是啥呢?!!
五、prototype
首先我们已经知道javascript可以共享方法,那我们是否想知道为啥这玩意能共享呢?答案就在prototype
里。
我们知道可以通过构造函数创建对象,那么我们先创建一个Person对象。当中有eat()的方法
function Person(name, age) {
this.name=name;
this.age=age;
this.eat=function () {
console.log(this.name+" 我吃过饭啦");
}
}
如果再创建两个对象person1和person2
var person1=new Person("xiaoming",11);
var person2=new Person("xiaohua",11);
这样显然成功创建了两个对象,xiaoming和xiaohua,那么问题来了,xiaoming是男的,xiaohua是女的,如果构造函数function Person(name,age)
这个构造函数有些方法男女是不能公用的,但是javascript中却又是在一个对象的基础上创建一个新的对象,所以我们不得不在Person的基础上拿了相同的方法。但是有些方法却又用不上的,岂不是很浪费自己的资源和占用不必要的内存?所以为了动态分配,有了prototype
这个属性。
所以我们在原来基础上加一个prototype
,
Person.prototype.male=function () {
console.log(this.name+"我是男的");
};
Person.prototype.female=function () {
console.log(this.name+"我是女的");
};
var person1=new Person("xiaoming",11);
person1.male();
var person2=new Person("xiaohua",11);
person2.female();
这样假如有一天,xiaohua想变男人了,一样能够调用male方法,这样不会相互影响。
参考博客: