为什么要用添加原型的方法丰富js自定义构造函数

在js面向对象思想里,所有方法都要交给不同对象来实现具体功能,那么问题来了。我们怎么来创建对象,京可能优雅的方式创建对象呢?

老夫写代码要考虑优雅?不存在的,那就一把梭!

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <title></title>
</head>

<body>
  <script>
    function Person(name, age) {
      this.name = name;
      this.age = age;
      this.sayHay = function () {
        console.log('Hi')
      }
    }

    var p1 = new Person('zs', 25);
    var p2 = new Person('ss', 25);
    console.log(p1.sayHay == p2.sayHay) //false
    /**
     * 意味着没创建一个实例对象就实例化一次
     *复杂类型不会直接存值,会比较地址(也就是说是每次new都会在内存中创建新的地址)
     * 十分浪费性能
     * /
  </script>
</body>

</html>

这就尴尬了。。。。我要是创建几十个对象,就实例化几十次?额,传出去不好听把。。。那就换一种?

第二版改进下!你不是每创建一次就实例化一次这个匿名函数么。。。那好

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <title></title>
</head>

<body>
  <script>
    function sayHello() {
      console.log('sayHello')
    }

    function Person(name, age) {
      this.name = name;
      this.age = age;
      this.sayHay = sayHello
    }

    var p1 = new Person('zs', 25);
    var p2 = new Person('ss', 25);
    console.log(p1.sayHay == p2.sayHay) //true
    /**
      *那么问题又来了。。。
      *这么干虽然我们把实例化对象提到外面,不会创建新的地址,都会指向sayHello
      *但是我们这样的干法。。。。又造成了全局污染。。。想得到我们几百个对象,就要创建几百个全局方法的恐怖么。。。
      *我经历过。。。
      */

  </script>
</body>

</html>

那好吧,再换换思路。。。原型链,了解下~

 

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <title></title>
</head>

<body>
  <script>
    function sayHello() {
      console.log('sayHello')
    }

    function Person(name, age) {
      this.name = name;
      this.age = age;
    }
    Person.prototype.sayHay = function () {
      console.log('Hi')
    }
    var p1 = new Person('zs', 25);
    var p2 = new Person('ss', 45);
    console.log(p1.sayHay == p2.sayHay) //true
    /**
     *通过原型创建出来的对象可以访问原型上的任意方法
     */
  </script>
</body>

</html>

好吧,,,问题就这么解决了。。。

哩个flag以后创建对象都用原型链把,,,,看以前写的代码,,脑壳痛

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章