zoukankan      html  css  js  c++  java
  • 【JavaScript】动态原型模式创建对象 ||为何不能用字面量创建原型对象?

       var proto = "";
        function Person(name, age, job) {
            this.name = name;
            this.age = age;
            this.job = job;
            if (typeof this.sayname != 'function') {
                //这里不能使用字面量创建原型对象
                //Person.prototype.sayname = function() {
                //    console.log("name = " + this.name);
                //   };
                proto = Person.prototype;//没有经过字面量重写的原型对象
                //假如使用字面量创建原型对象 
                Person.prototype =
                {
                    sayname: function() {
                        console.log("Name:" + this.name);
                    }
                }
                console.log(proto == Person.prototype)//false 说明Person原型对象已被重写改变
            }
        }
        var person = new Person("Jack", 25, 'Programmer');
        console.log(person.__proto__ == proto);//true 实例对象的__proto__指向原先的原型对象,而不是被字面量重写的原型对象
        person.sayname();//undefined 没有新原型对象的方法
    已经创建了实例的情况再用字面量重写原型,那么就会切断现有实例与新原型之间的联系,以上说的换个写法就如下:
            function Person() { };
            var proto = Person.prototype;
            var person = new Person;//实例对象在前
            Person.prototype =
            {
                name: "Jack",
                sayname: function() {
                    console.log("Name:" + this.name);
                }
            }
            console.log(Person.prototype.isPrototypeOf(person)); //false 新原型不在person对象原型链上
            console.log(proto.isPrototypeOf(person)); //true 原先的原型对象在person对象原型链上

      如果要实现为已经创建的实例对象添加方法,可以这样写:

            function Person() { }
            var person = new Person();//实例对象在前
            Person.prototype.name = 'Jack';
            Person.prototype.sayName = function() {
                console.log(this.name);
            }
            person.sayName();//Jack

      这样做就不是重新声明一个原型对象,而是对原来的原型对象进行扩展

  • 相关阅读:
    高斯消元学习
    HDU 4596 Yet another end of the world(解一阶不定方程)
    Codeforces Round #318 div2
    HDU 4463 Outlets(一条边固定的最小生成树)
    HDU 4458 Shoot the Airplane(计算几何 判断点是否在n边形内)
    HDU 4112 Break the Chocolate(简单的数学推导)
    HDU 4111 Alice and Bob (博弈)
    POJ 2481 Cows(线段树单点更新)
    HDU 4288 Coder(STL水过)
    zoj 2563 Long Dominoes
  • 原文地址:https://www.cnblogs.com/fly4j/p/4538051.html
Copyright © 2011-2022 走看看