• 【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

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

  • 相关阅读:
    Scott Mitchell 的ASP.NET 2.0数据教程
    asp.net单点登录 一个账号只能在一个地方登录
    javascript关键字加亮加连接
    Windows环境变量
    IE支持HTML5的解决方法
    JavaScript test() 方法及判断是否为iPhone|iPad|iPod
    《C#4.0中文视频教程共20课完整版》下载
    DataView.RowFilter 的使用
    SQL Server中如何备份到异机
    完美兼容IE、FF、Opera的Ajax类支持get、post、自定义回调函数
  • 原文地址:https://www.cnblogs.com/fly4j/p/4538051.html
Copyright © 2020-2023  润新知