【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

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

时间: 2024-10-22 08:06:14

【JavaScript】动态原型模式创建对象 ||为何不能用字面量创建原型对象?的相关文章

JavaScript之面向对象学习六原型模式创建对象的问题,组合使用构造函数模式和原型模式创建对象

一.仔细分析前面的原型模式创建对象的方法,发现原型模式创建对象,也存在一些问题,如下: 1.它省略了为构造函数传递初始化参数这个环节,结果所有实例在默认的情况下都将取得相同的属性值,这还不是最大的问题! 2.最大的问题是原型中的所有属性是被很多实例所共享的,这种共享对于函数非常合适,对于那些包含基本值的属性也说得过去,因为我们知道可以在实例上添加一个同名属性,可以隐藏原型中的对应属性.但是对于包含应用类型值的属性来说,问题就非常严重了,代码如下: function Person(){ } Per

javascrip原型模式创建对象

要实现更高的数据代码共享,则应使用原型模式. 1.原型对象 在javascript中,我们创建函数时,都会有一个prototype属性即原型属性.这个属性是一个指针,指向一个对象,这个对象的用途就是实现实例的属性.方法共享. 在默认情况下,所有的原型对象都会自动获得一个constructor属性即构造函数属性,该属性指向原对象. 这个神马内存指向的图我是不会画.话说Visio能不能画这种图哇.有木有大神讲解一下~ 反正就是: Dog.prototype.constructor==Dog;//tr

函数创建对象(4)动态原型模式

把所有信息封装在构造函数内,通过在构造函数中初始化原型,保持了同时使用构造函数和原型的优点,通过检查某个应该存放的方法是否有效,来决定是否需要初始化原型.(通过if判断) function Person(name,age,job){ this.name=name; this.age-age; this.job=job; //判断方法是否存在 if(typeof this.sayName!="function"){ Person.prototype.sayName=function(){

面向对象编程-基础(工厂、构造函数、原型、混合、动态等模式)

本文参考:js高级程序设计 第三版这篇文章我啃了大半天写的,是很烦,没有毅力看下去的注定还是不会(1).工厂模式:封装一个函数createPerson,这个函数可以创造一个人对象,包含三个属性和一个方法,然后利用这个函数分别创建了2个对象p1,p2. function createPerson(name,age,job){ var p=new Object(); p.name=name; p.age=age; p.job=job; p.showName=function(){ alert(thi

组合使用构造函数模式和动态原型模式、寄生构造函数模式(创建具有额外方法的特殊数组)

function Bird(name, age) {     this.name = name;     this.age = age;     this.sons = ["Tom", "John"];     //在sayName()方法不存在的情况下,添加到原型中     if (typeof this.sayName != "function") {         Bird.prototype.sayname = function() {

第6章 面向对象的程序设计 6.2 原型模式

我们创建的每个函数都有一个 prototype (原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含特定类型的所有实例共享的属性和方法.按照字面意思来理解,那么 prototype 就是通过调用构造函数而创建的那个对象实例的原型对象.(有点类似于java中的类) 因此不必在构造函数中定义对象实例的信息,而是可以将这些信息直接添加到原型对象中,如下所示: function Person(){ } Person.prototype.name = "Nicholas"; P

javascript面向对象系列2——创建对象的9种方式

[1]使用Object构造函数 [缺点]使用同一个接口创建很多对象,会产生大量重复代码 var person = new Object(); person.name = "Nicholas"; person.age = 29; person.job = "Software Engineer"; person.sayName = function(){ alert(this.name); } [2]使用对象字面量 [缺点]使用同一个接口创建很多对象,会产生大量重复代码

js - 创建对象的几种方式(工厂模式、构造函数模式、原型模式)

原文引用https://www.dazhuanlan.com/2019/08/26/5d62f8b594f10/ 工厂模式 做法:内部创建一个对象,并未对象属性赋值并且返回 缺点:解决创建多个相识对象的问题,但不能识别创建的对象的类型 构造函数模式 做法:直接将属性和方法赋值给 this 对象,没有 return 语句 缺点:对象不是共用方法和属性,每 new 一次对象就要创建一个内存,超出性能消耗 原型模式 做法:通过 prototype 为对象添加属性 缺点:每个实例都共享属性方法,实例中修

"围观"设计模式(10)--创建型之原型模式(Prototype Pattern)

原型模式是创建型模式的一种,其特点在于通过"复制"一个已经存在的实例来返回新的实例,而不是新建实例.被复制的实例就是我们所称的"原型",这个原型是可定制的. 原型模式多用于创建复杂的或者耗时的实例,因为这种情况下,复制一个已经存在的实例使程序运行更高效:或者创建值相等,只是命名不一样的同类数据.----WIKIPEDIA 首先看下面这样的一个例子,使用本人自黑一下,实现Clonable接口然后实现它的clone的方法,然后通过该方法对这个对象进行克隆.看是不是像我们