zoukankan      html  css  js  c++  java
  • JavaScript Prototype

     function Person(name) {
                this.name = name;
                this.showMe = function () {
                    alert(this.name);
                }
            };
    
            Person.prototype.from = function () {
                alert('I come from prototype.');
            }
            Person.prototype.school = "nanjing";
            var father = new Person('js');
            console.dir(father);

    Person

    father

    看到了什么,我看到了一个循环,头晕。

      function Person(name) {
                this.name = name;
                this.showMe = function () {
                    alert(this.name);
                }
            };
    
            Person.prototype.from = function () {
                alert('I come from prototype.');
            }
            Person.prototype.school = "nanjing";
            var father = new Person('js');
            console.dir(Person.prototype);
            console.dir(Person.prototype.constructor.prototype);
            console.dir(father.constructor.prototype); 
            console.dir(father);

    发现Person.prototype

    Person.prototype.constructor.prototype

    father.constructor.prototype这三个都是一个东西,就是Person类相对应的原型对象

    father中有一个内置的原型对象(_proto_)也是Person类相对应的原型对象

     function Person(name) {
                this.name = name;
                this.showMe = function () {
                    alert(this.name);
                }
            };
    
            Person.prototype.from = function () {
                alert('I come from prototype.');
            }
            Person.prototype.school = "nanjing";
            var father = new Person('js');
            console.dir(Person);
            console.dir(Person.prototype.constructor);
            console.dir(father.constructor); 
            console.dir(father);

    发现Person.prototype.constructor

    father.constructor都是Person类

    按照《悟透javascript》书中说的,new形式创建对象的过程实际上可以分为三步:
    第一步是建立一个新对象(叫A吧);

    第二步将该对象(A)内置的原型对象设置为构造函数(就是Person)prototype 属性引用的那个原型对象

    第三步就是将该对象(A)作为this 参数调用构造函数(就是Person),完成成员设置等初始化工作。

    其中第二步中出现了一个新名词就是内置的原型对象,注意这个新名词跟prototype对象不是一回事,为了区别我叫它inobj,inobj就指向了函数Person的prototype对象。在person的prototype对象中出现的任何属性或者函数都可以在one对象中直接使用,这个就是javascript中的原型继承了。

    本人不会作图,这张图作的欲生欲死。

    由此发现,人人都说function是一个特殊的object,特殊就特殊在prototype,每一个function对象都有一个prototype属性,而其他的object没有。

    看看通过prototype的继承

     function Person(name) {
                this.name = name;
                this.show = function () {
                    alert(this.name);
                }
            };
            Person.prototype.from = function () {
                alert('I come from prototype.');
            }
            Person.prototype.school = "nanjing";
            var father = new Person('father');
            function Chinese() {
                this.chineseName = "son";
                this.chineseShow = function () {
                    alert(this.name);
                }
            }
            Chinese.prototype = father;
            Chinese.prototype.color = "yellow";
            Chinese.prototype.say = function () {
                alert("我是一条龙");
            }
    
            var china = new Chinese();
            console.dir(father);
            console.dir(Chinese);
            console.dir(china);
            console.dir(china.constructor);

    由此可以看出china的constructor是Person,不是Chinese

    给Chinese.prototype添加的属性方法全部都添加到了father对象上,不是添加到了Person.prototype上。

    总结:

    在prototype.js框架中有一个类的初始化

     var Class = {
                create: function () {
                    console.log("1");
                    return function () {            //其实这个就是返回的类 A 内部没有执行
                        console.log("2");
                        this.initialize.apply(this, arguments);   //当类A实例化时执行,等于把A.prototype.initialize中的代码放到这里,这个调用必须先给A.prototype加上initialize.
                    }
                }
            };
            var A = Class.create();
            console.dir(A);
            A.prototype.initialize = function () {
                this.name = "hongda";
                this.show = function () {
                    alert(this.name);
                }
                alert(this.name);
                console.log("3");  
            }
            console.dir(A);
            var a = new A();      
            console.info("a");
            console.dir(a);

    这种方式就是把一个类的所有成员都放在了该类的prototype的对象中,该类内部没有成员,使该function更“类"化。

    http://blog.csdn.net/niuyongjie/article/details/4810835

  • 相关阅读:
    专业实训日志01
    《河北省重大技术需求征集系统》可用性及可修改性战术分析
    基于淘宝网的软件质量属性分析
    架构漫谈读后感之软件架构师如何工作
    模型-视图-控制器模式(MVC模式,10种常见体系架构模式之一)
    列举实例分析采用的可用性和可修改性战术
    以淘宝网为例的质量属性分析
    《架构漫谈》读后感 之“关于软件架构师如何工作”
    《软件需求(第二版)》阅读笔记06
    《软件需求(第二版)》阅读笔记05
  • 原文地址:https://www.cnblogs.com/hongdada/p/2872494.html
Copyright © 2011-2022 走看看