Javascript原型链
来源:互联网 发布:win7注册表修复软件 编辑:程序博客网 时间:2024/06/17 15:27
明白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方法,这样不会相互影响。
参考博客:
http://barryliu1995.studio/2017/08/04/%E8%B0%88%E8%B0%88JavaScript%E7%9A%84%E5%8E%9F%E5%9E%8B%E5%8F%8A%E5%8E%9F%E5%9E%8B%E9%93%BE/#more
- JavaScript原型,原型链
- JavaScript-原型、原型链
- JavaScript原型,原型链
- JavaScript-原型、原型链
- JavaScript原型对象、原型属性、原型链
- javascript原型和原型链
- javascript原型与原型链
- Javascript原型和原型链
- JavaScript原型以及原型链
- JavaScript原型与原型链
- JavaScript原型和原型链
- Javascript原型和原型链
- Javascript原型和原型链
- JavaScript原型和原型链
- JavaScript原型和原型链
- javascript原型与原型链
- javascript 原型和原型链
- javascript prototype 原型链
- CentOS学习(二)之CentOS6.5网络设置
- GitHub-全球最大的TX交友平台-使用教程
- numpy 数组维度操作总汇
- 操作系统06-临界区
- Echarts用户自定义图表title
- Javascript原型链
- JavaSE 直接选择排序
- 线程优先级
- redis3.0踩坑经历
- 树结构(有id和pid字段)数组,生成多层嵌套的json对象
- java并发编程
- 3年工作经验的程序员应该具备的技能
- java 代码转换音频数据格式(字节数组转换)
- laravel框架 创建控制器