原型

定义:prototype 是函数对象的一个属性。函数的prototype也是一个对象

  1. 函数的prototype里的构造函数指向函数本身。

    1. function HandPhone(){}
    2. console.log(HandPhone.prototype)//{constructor:HandPhone(){}}

    image.png

  2. prototype是 构造函数构造出的对象的祖先。所有被构造函数构造出来的对象都可以继承原型上的属性和方法

    1. function HandPhone(color,brand) {
    2. this.color = color;
    3. this.brand = brand;
    4. }
    5. HandPhone.prototype.ram = '64G';
    6. HandPhone.prototype.rom = '6G';
    7. HandPhone.prototype.intro = function () {
    8. console.log('I am '+ this.brand +' Phone')
    9. }
    10. var p1 = new HandPhone('red', 'HuaWei');
    11. var p2 = new HandPhone('white', 'MI');
    12. p1.intro();// I am HuaWei Phone;
    13. console.log(p1.ram);// 64g
    14. console.log(p1.rom);//6g
  3. 构造函数里prototype里的constructor 指向本身。

image.png

可以修改constructor

  1. // 一个构造函数
  2. function TelePhone() {
  3. }
  4. //重新修改HandPhone的原型
  5. HandPhone.prototype = {
  6. constructor :TelePhone//这里修改了HandPhone原型里的构造函数。
  7. };
  8. function HandPhone(color,brand) {
  9. this.color = color;
  10. this.brand = brand;
  11. }
  12. HandPhone.prototype.ram = '64G';
  13. HandPhone.prototype.rom = '6G';
  14. HandPhone.prototype.intro = function () {
  15. console.log('I am '+ this.brand +' Phone')
  16. }
  17. var p1 = new HandPhone('red', 'MI')
  18. p1.intro();
  19. console.log(HandPhone.prototype);

image.png

proto是实例化后的结果.里面存着的是他的构造函数的原型。

  1. function Car(){}
  2. var car = new Car();
  3. console.log(car,Car.prototype);

image.png

实例化后的对象可以修改proto的值;

  1. function Person() {
  2. }
  3. Person.prototype.name = "张三";
  4. var p1 = {
  5. name:'李四'
  6. }
  7. var person = new Person();
  8. console.log(person.name);//张三
  9. person.__proto__ = p1;
  10. console.log(person.name);//李四

实例化之后的对象

  1. function Person() {
  2. }
  3. //person的原型添加一个name 属性
  4. Person.prototype.name = '张三';
  5. //实例化p1
  6. var p1 = new Person();
  7. //重新赋值Person的原型
  8. Person.prototype = {
  9. name: '李四'
  10. }
  11. //此时虽然修改拿了name,但是p1已经实例化完毕。如果再实例化一个p2 那么p2的名字就会被改
  12. console.log(p1.name);//张三
  13. console.log(Person.prototype.name);//李四

image.pngimage.png

解释

  1. function Person() {}
  2. Person.prototype.name = '张三';
  3. var p1 = new Person();
  4. // Person.prototype.name ='李四'
  5. Person.prototype = {
  6. name: '李四',
  7. constructor: Person
  8. }//可以理解成是一个重新赋值。堆里的内存地址发生变化。
  9. console.log(p1.name);//张三
  10. console.log(Person.prototype.name);
  11. /***
  12. * 解释
  13. * Person 在实例化的过程中,
  14. * 隐式申明了一个 this ={
  15. * __proto__:Person.prototype//Person.prototype 本身就是一个对象、
  16. * }
  17. *
  18. */

window和return

  • return ```javascript //window和return

function test() { var a = 1; function add() { a++; console.log(a); } return add; } var add = test(); add();//2 add();//3 add();//4

  1. - window
  2. ```javascript
  3. function test() {
  4. var add = 1;
  5. function add() {
  6. a++;
  7. }
  8. window.add = add;
  9. }
  10. test();
  11. add();//2
  12. add();//3
  13. add();//4
  • 自启动函数

    • return 方式

      1. var add = (function () {
      2. var a = 1;
      3. function add() {
      4. a++;
      5. console.log(a);
      6. }
      7. return add;
      8. })();
      9. add();
      10. add();
      11. add();
    • window 方式

      1. (function () {
      2. var a = 1;
      3. function add() {
      4. a++;
      5. console.log(a);
      6. }
      7. window.add=add;
      8. })();
      9. add();
      10. add();
      11. add();

      JS插件写法

      1. (function () {
      2. function Add() {
      3. }
      4. Add.prototype = {};
      5. window.Add = Add;
      6. }())
      7. var add = new Add();

      作业 ```javascript ;(function () { function Compute(opt) { this.firstNum = opt.firstNum; this.secondNum = opt.secondNum; } Compute.prototype = { minus:function () {

      1. return this.firstNum - this.secondNum;

      }, div:function () {

      1. return this.firstNum / this.secondNum;

      }, mul:function () {

      1. return this.firstNum * this.secondNum;

      }, plus:function () {

      1. return this.firstNum + this.secondNum;

      } } window.Compute = Compute; }())

var cp = new Compute({ firstNum: 1, secondNum:2 }) console.log(cp.minus()); console.log(cp.div()); ```