js属性扩展,继承,属性查找

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js属性扩展,继承,属性查找相关的知识,希望对你有一定的参考价值。

javascript 是一种基于原型的面向对象语言
在 javaScript 中,每个对象都有一个它的原型(prototype)对象的引用,这个原型对象又有自己的原型,直到某个对象的原型为 null 为止,这种一级一级的链结构就称为原型链(prototype chain)。比如
定义一个object对象var o={},它的原型为Object.prototype,而Object.prototype的原型为null

 下面为示例代码

   <script type="text/javascript">
            var o={name:"aa"};
       function findPrototype(o) {              
                if(o!=null){  
                   var a=  Object.getPrototypeOf(o);
                    console.info(a);
                    arguments.callee(a);
                }
       }
       var a=function(){};
       findPrototype(o);
       findPrototype(a);
    </script>


技术分享 

证明一下每个对象都有一个它的原型(prototype)对象的引用,下面是一段演示的代码 

function  myDialog (id,title) {

       this.title=title||"标题";
       this.id=id;
      this.show=function(){
          console.info("窗体标题是:"+this.title);
        }
    }

 //在myDialog 的原型上扩展一个move方法

  myDialog.prototype.move=function(){
          console.info("可以拖拽移动");
     }

 

 //创建两个对象

 

var d1=new myDialog("#win");

 var  d2=new myDialog("#win");

 //分别输出对象上的show函数,原型上的move是否相同,如果都相同,可以说对象没有它的原型(prototype)对象的引用,如果不同则说明每个对象都有一个它的原型(prototype)对象的引用

 

console.info(d1.show==d2.show);

 

console.info(d1.move==d2.move);

//输出结果为

 技术分享

说明每个对象都有一个它的原型(prototype)对象的引用

 

 js属性扩展:

 一般分为两种,一种是静态属性,一种是实例属性(非静态属性)

 <script type="text/javascript">
    function  myDialog (id,title) {
       this.title=title||"标题";
       this.id=id;
      this.show=function(){
          console.info("窗体标题是:"+this.title);
        }
    }

// 扩展静态属性,在方法上直接扩展myDialog,访问时直接方法.属性的方式访问,如myDialog.defaults.shade

   myDialog.defaults={
        resize:false,
        shade:true,
   }

//扩展静态方法,访问方式如Math.abs()的方式相同 

   myDialog.help=function(name){
      console.info("查询"+name+"用法");
   }

//实例属性,通过new之后访问 

    myDialog.prototype={
      constructor:new myDialog,//将constructor修改回myDialog
    
       open:function(){
               console.info("打开")
        },
        close:function(){ 
           console.info("关闭了");
        }
    }
    
     myDialog.prototype.move=function(){
          console.info("可以拖拽移动");
     }
     var d=new myDialog("#win","标题信息");
     console.info(d);
    </script>

 

 技术分享

继承基本上可以分为下面4种

1,基于原型链的继承

    function  myDialog (title) {
       this.title=title||"标题";
      
    }
   
   function alert(title,msg){
        this.base=myDialog;
 
        this.base(title);
        this.msg=msg;
   }
   alert.prototype=new myDialog;
   var a=new alert("标题1111","alert弹出框");
   console.info(a);

 技术分享
2,拷贝继承

 

    function  myDialog (options) {
      var copy=this;
        for(var key in options){//将传入的参数转化为myDialog的属性
             copy[key]=options[key];
         }
        delete copy;
    }
    myDialog.prototype.type="对话框";
    var d=new myDialog({title:"标题",content:"aaaa",shade:true});
    console.info(d);
   
   function alert(msg){
        
        this.msg=msg;
   }
//只能拷贝原型上的属性myDialog.prototype
 for(var key in myDialog.prototype){
      alert.prototype[key]=myDialog.prototype[key];
 }
   var a=new alert("alert弹出框");
   console.info(a);

 技术分享

3,ECMAScript 5继承方式

 

    function  myDialog (title) {
      this.title=title;
    }
   myDialog.prototype.type=‘弹出框‘;
   function alert(msg){
        
        this.msg=msg;
   }
alert.prototype = Object.create(myDialog.prototype);
   var a=new alert("alert弹出框");
   console.info(a);
   console.info(a instanceof myDialog );

 技术分享

4,使用call() / apply() 方法实现继承

function  myDialog (title) {

 

      this.title=title||"标题";
    }
   
   function alert(title,msg){
        myDialog.call(this,title);
        this.msg=msg;
   }
   var a=new alert("标题11111","alert弹出框");
   console.info(a);

 使用 javascript 的 call() 方法相对明了一些

 技术分享

属性查找 

在访问一个对象的属性时,JavaScript 将执行下面的步骤:
检查本地值是否存在。如果存在,返回该值。
如果本地值不存在,检查原型链(通过 __proto__ 属性)。
如果原型链中的某个对象具有指定属性的值,则返回该值。
如果这样的属性不存在,则对象没有该属性。

以上是关于js属性扩展,继承,属性查找的主要内容,如果未能解决你的问题,请参考以下文章

JS难点概念2——继承

js之原型链&继承

JS的原型和继承

css3 flex布局结合transform生成一个3D骰子

JS基础 类

JS中对象的特征:继承