美文网首页
理解JavaScript原型

理解JavaScript原型

作者: 李悦之 | 来源:发表于2017-08-01 23:26 被阅读13次

一、看图写代码

屏幕快照 2017-08-01 下午9.00.53.png
var person_prototype = {name:'那个谁', run: function(){ console.log('能跑') }, walk: function(){ console.log('能走') }}
person1 = {}
person2 = {}
person1.__proto__ = person_prototype
person2.__proto__ = person_prototype
person1.name   // 那个谁
person2.run()  //能跑

通过将一声公有属性赋值给person1和person2的prototye上,使这两个对象有了默认的属性。

屏幕快照 2017-08-01 下午9.19.03.png

如果有三层呢,第一层person1,person2私有,第二层是亚洲人共有的属性(兄弟级有欧洲人),最下面是人类共有的属性,代码怎么写?

var person_prototype = {name:'那个谁', run: function(){ console.log('能跑') }, walk: function(){ console.log('能走') }}   //全人类的公有属性
var asian_prototype = { skin:'黄色', hair:'黑色' }  //亚洲人的公有属性
asian_prototype.__proto__  = person_prototype  //将人类的的公有属性赋给亚洲人公有属性的原型上
var person1 = {}
var person2 = {}
person1.__proto__ = asian_prototype
person2.__proto__ = asian_prototype
person1.name // '那个谁' 会先搜索第一层原型,如果没有再搜索第二层原型,不断向下

person1返回结果如下:

屏幕快照 2017-08-01 下午9.37.13.png

二、原型链

许多JS类型都有各自的原型:

  • 所有的对象都有toString() valueOf() constructor hasOwnProperty()
  • 所有的数组都有push() pop() shift() unshift() join() slice() splice()
  • 所有的数组都有对象的所有方法,因为数组就是对象的一种
  • var a = [] 那么a具有所有数组的公有属性,也具有所有对象的公有属性
  • a[0] = 'yyy' 这样就添加了私有属性,是数组a私有的
原型链的树型结构.png

这篇文章很有价值:什么是JS原型链

屏幕快照 2017-08-01 下午10.28.28.png

向下找它的原型一定会找到null

三、Object.create()

  • Object.create() 这是创造原型的方法,为什么不直接用proto?因为这个属性还没有纳入规范
var human = {run:function(){ console.log('能跑') }, walk:function(){ console.log('能走') }}
var asian = Object.create(human) //将human变量作为原型添加给asian
asian.skin = 'yellow'  // 私有属性
asian.hair = 'black'    // 私有属性
var person1 = Object.create(asian)  //将asian对象作为原型给person1
person1.name = '小明'  //添加私有属性

结果如下:

屏幕快照 2017-08-01 下午11.02.08.png

四、原型的使用:一个小游戏

var soldierList = []

for(var i=0; i<100; i++){
  var soldierProto = {
    attack: function(){ console.log('打他') },
    die: function(){ console.log('挂了') },
    walk: function(){ console.log('能走') }
  }
  var soldier = Object.create(soldierProto)
  soldier.life = (Math.random()+1)*100
  soldierList.push(soldier)  
}

factory.create(soldierList)

构造函数啊。。。。要看啊。。。。

相关文章

网友评论

      本文标题:理解JavaScript原型

      本文链接:https://www.haomeiwen.com/subject/jrfslxtx.html