原型

作者: frameworkofthin | 来源:发表于2019-04-13 14:53 被阅读0次

前置知识

  • 只有函数才有prototype(原型)属性。当函数创建后,会自动添加这个prototype。
  • 每个对象都有proto属性,proto指向构造函数的原型对象
  • 原型对象也是对象,所以也会有proto,于是就这样有了对象和原型对象之间的关系,这样的一条链,就是原型链

使用原型的好处

  • 多个实例之间共享属性和方法
  • 减少内存消耗(因为共享了属性和方法了,就不需要重新为新的属性和方法开拓新的内存了)

对象的创建

// 字面量
let a = { name: '张三' }

// 构造函数
function A() {
  this.name = '张三'
}
let a = new A()

new这个操作符做了什么工作

function Person() {}
let a = new Person()

// new所做的工作
let obj = {}
obj.__proto__ = Person.prototype
Person.call(obj)
return obj

注意点:


// 在实例后,以下这种写法会导致a.__proto__无法追踪(实例前是可以这么写的,不影响)
let a  = new Person()
Person.prototype = {
  name: '11'
}
// a.name => undefine

// 这种写法,a.__proto__还是能追踪到
Person.prototype = {
  name: '11'
}
let a = new Person()
a.name => '11'

为了避免这种问题,还是建议用
Person.prototype.name = '11' // 并没有重新定义新的prototype,所以能追踪到

题目:

// 挑战一
// 1.定义一个构造函数 Animal,它有一个 name 属性,以及一个 eat() 原型方法。
// 2.eat() 的方法体为:console.log(this.name + " is eating something.")。
// 3.new 一个 Animal 的实例 tiger,然后调用 eat() 方法。
// 4.用 __proto__ 模拟 new Animal() 的过程,然后调用 eat() 方法。

var Animal = function(name){
    // 待补充的代码
};

var tiger = new Animal("tiger");
// 待补充的代码

var tiger2 = {};
// 待补充的代码
// 挑战二
// 1.定义一个构造函数 Bird,它继承自 Animal,它有一个 name 属性,以及一个 fly() 原型方法。
// 2.fly() 的方法体为:console.log(this.name + " want to fly higher.");。
// 3.new 一个 Bird 的实例 pigeon,然后调用 eat() 和 fly() 方法。
// 4.用 __proto__ 模拟 new Bird() 的过程,然后用代码解释 pigeon2 为何能调用 eat() 方法。

var Bird = function(name){
      // 待补充的代码
}

var pigeon = new Bird("pigeon");
// 待补充的代码

var pigeon2 = {};
// 待补充的代码
// 挑战三
// 1.定义一个构造函数 Swallow,它继承自 Bird,它有一个 name 属性,以及一个 nesting() 原型方法。
// 2.nesting() 的方法体为:console.log(this.name + " is nesting now.");。
// 3.new 一个 Swallow 的实例 yanzi,然后调用 eat()、fly() 和 nesting() 方法。
// 4.用 __proto__ 模拟 new Swallow() 的过程,然后用代码解释 yanzi2 为何能调用 eat() 方法。

var Swallow = function(name){
      // 待补充的代码
}

var yanzi = new Swallow("yanzi");
// 待补充的代码

var yanzi2 = {};
// 待补充的代码

// 题目要求:
// 创建一个shape对象,该对象有一个type属性和getType()方法;  
// 定义一个原型为shape的Triangle()构造函数,用Triangle()创建的对象应有三个对象属性—-a、b、c,分别用于表示三角形的三条边
// 在对象原型中添加一个名为getPerimeter()的新方法,用下面的代码来进行测试:


var t = new Triangle(1,2,3);
t.constructor===Triangle;——true
shape.isPrototypeOf(t);——true
t.getPerimeter();——6
t.getType();——"triangle"

自己写的答案

let shape = { type: 'triangle', getType: function () { return this.type } }
function Triangle (a, b, c) {
  this.a = a
  this.b = b
  this.c = c
}
shape.constructor = Triangle
shape.getPerimeter = function () { return 6 }
Triangle.prototype = shape

推荐文章:
https://juejin.im/post/585953a5128fe10069b5f06b (看完懂了很多)
https://www.cnblogs.com/wangfupeng1988/tag/%E4%BD%9C%E7%94%A8%E5%9F%9F%E9%93%BE/ (王福朋)

相关文章

  • JavaScript 原型、原型链与原型继承

    原型,原型链与原型继承 用自己的方式理解原型,原型链和原型继承 javascript——原型与原型链 JavaSc...

  • JavaScript 原型和原型链

    原型 在 JavaScript 中,我们所称的原型有两个使用语境: 原型关系 原型属性 原型关系指对象的原型对象,...

  • JavaScript 原型和原型链

    原型 在 JavaScript 中,我们所称的原型有两个使用语境: 原型关系 原型属性 原型关系指对象的原型对象,...

  • 原型、原型链

    (什么是原型、原型链?有什么作用) JavaScirpt深入之从原型到原型链 图解 Javascript 原型链 ...

  • 关于原型原型链的理解

    什么是原型? 什么是原型链? 为什么需要原型,和原型链?

  • js的原型对象&原型链&js的继承

    原型对象 & 原型链 原型对象分2种:显式原型和隐式原型。 显式原型就是我们常用的prototype属性,是函数的...

  • 4.4 JavaScript

    4.4.1. 原型链 4.4.1.1. 显式原型和隐式原型   JavaScript的原型分为显式原型(expli...

  • 原型、原型链

    理解JavaScript原型 彻底理解JavaScript原型 原型 原型是一个对象,所有对象都可以成为原型,其...

  • 廖雪峰JS小记

    (function(){})() 原型,原型链 浅谈Js原型的理解JS 原型与原型链终极详解 对象 对象:一种无序...

  • 2-6 原型和原型链 - 5个原型规则

    2-6 原型和原型链 - 5个原型规则 5条原型规则,原型规则是学习原型链的基础。 第一、所有引用类型(数组、函数...

网友评论

      本文标题:原型

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