对象的原型链

来源:互联网 发布:赤壁赋一词多义知乎 编辑:程序博客网 时间:2024/05/16 14:37
一、对象类型:是一个很弱的概念

var n=123;//数据类型
    n='a';//字符串类型

    n={};//对象类型

***在js中数据是有类型的,但是变量是没有类型约束的

**对象的类型是什么? 答:typeof操作对象,统一返回的是object(小写的o)


二、typeof返回的类型

typeof [];//object                                                  对象类型名   Array

typeof{};//object                                                  对象类型名   Object

typeof 123;//number                                        对象类型名   Number

typeof "  ";//string                                               对象类型名   Sring

typeof true;//boolean                                      对象类型名   Boolean

typeof new Date();//object                                 对象类型名  Date

typeof /123/;//正则表达式,object               对象类型名   Regent

typeof function(){};//function                       对象类型名   Function

***需要明确对象的类型以便做复杂的处理,例如封装方便。

function Person(){}//常常描述Person

var p=new Person();

***创建XXX 对象,描述的是构造方法的名字;

***构造函数的名字就是对象类型的 名字。



三、

{};---》报错,因为要让花括号变成表达式来使用,用中括号圈起来;;;({ })---》Object,因为圆括号是运算符,将{}解析成表达式,才能运算;

感叹号:!{};//false

加号:+{};//number,转换数字


四、对一个对象都可以访问到一个属性,其中有一个是constructor(构造器),对象的constructor属性描述的是其构造函数;

function Fn(){}

var o=new Fn();

console.log(o.constructor===Fn);//结果:true


每一个对象都连接到其原型对象上;对象的constructor属性是其原型对象提供的;每一个对象都有原型对象。

如何获取对象类型?

答:构造函数的名字


五、获取对象类型名

function Person(){}

var p=new Person();

//1.获取对象的构造函数

var ctr=p.constructor;

//2。将函数转换为字符串

var s=" "+ctr;  //alert (s);弹出的样式是:function Person(){}

//3.将function与(之间的字符串截取出来

//3.1传统字符串处理函数

var start=s.replace("function","|").indexOf("|");//找到竖线的索引

if(start !=-1){

   var end=s.replace("function","|").indexOf("(");

if(end!=-1){

  var name=s.replace("function","|").slice(start+2,end);//     |    Person

 alert("|"+name+"|");

}



1、<string>.replace(<sring>,<string>);//前面取代后面

       string  <string>.replace(<sring>,<string>);//返回新的字符创,带<>表示变量或者对象,没有带<>,表示类型

2、number <stirng>.indexOf(<string>);

3、string <String>.slice(startIndex,endIndex)



改良1:获取对象类型名Person

function Person(){}

var p=new Person();

var s=p.constructor;

var changeStr=""+s;

//简化一:将重复的字符串处理合并,利用一个变量来描述

changeStr=changeStr.replace("function","|");//替换结果:   |  Person(){}

//简化二、if嵌套if代码很复杂

var start=changeStr.indexOf("|");

if(start !=-1){

 var end=changeStr.indexOf("(");

   if(end !=-1){

      var name=changeStr.slice(start+2,end);

      alert("|"+name+"|");

            }

  }

结果是:|name|

//改良3

function Person(){}

var p=new Person();

var str=p.constructor;

var s=""+str;

s=s.replce("function","|");

var start=s.indexOf("|");

var end=s.indexOf("(");

if(start != -1&&end !=-1){

  var name=s.slice(start+2,end);

 alert("|"+name+"|");

   }


4.正则表达式

function Person(){}

var p=new Person();

var ctr=p.constructor;

var s=""+ctr;

var r=/function (.+?)\(/;

var name=r.exec(s)[1];

alert("|"+name+"|");

.  :代表任意的字符,例如函数名是可以任意的

function :匹配function关键字

\(  :代表左边的(,不能直接(,需要\(转译

(.+?)  :匹配函数名

5、函数有个属性叫name,该属性表示函数的名字

function Person(){}

var p=new Person();

var ctr=p.constructor;

alert(ctr.name);//IE8不支持





改良1:获取对象类型名Person

function Person(){}

var p=new Person();

var s=p.constructor;

var changeStr=""+s;

//简化一:将重复的字符串处理合并,利用一个变量来描述

changeStr=changeStr.replace("function","|");//替换结果:   |  Person(){}

//简化二、if嵌套if代码很复杂

var start=changeStr.indexOf("|");

if(start !=-1){

 var end=changeStr.indexOf("(");

   if(end !=-1){

      var name=changeStr.slice(start+2,end);

      alert("|"+name+"|");

            }

  }

结果是:|name|

//改良3

function Person(){}

var p=new Person();

var str=p.constructor;

var s=""+str;

s=s.replce("function","|");

var start=s.indexOf("|");

var end=s.indexOf("(");

if(start != -1&&end !=-1){

  var name=s.slice(start+2,end);

 alert("|"+name+"|");

   }


4.正则表达式

function Person(){}

var p=new Person();

var ctr=p.constructor;

var s=""+ctr;

var r=/function (.+?)\(/;

var name=r.exec(s)[1];

alert("|"+name+"|");

.  :代表任意的字符,例如函数名是可以任意的

function :匹配function关键字

\(  :代表左边的(,不能直接(,需要\(转译

(.+?)  :匹配函数名

5、函数有个属性叫name,该属性表示函数的名字

function Person(){}

var p=new Person();

var ctr=p.constructor;

alert(ctr.name);//IE8不支持




5.允许IE8支持的代码

//写一个函数获取函数名
function getFn(fn){ //////属于封装函数:体现浏览器的兼容性问题;每次要获取函数名直接调用就好;
  if(typeof fn !== "function") return;//验证传入的一定是函数
//保证是函数

  if(fn.name){//如果ie8不支持fn.name,则执行else中的正则表达式
    return fn.name;
    }
  else{
    return /function(.+)\(/.exec(fn+'')[1];
  }
}

function Person(){}
var p=new Person();
var name=getFn(p.constructor);//直接调用函数
alert(name);
结果:Person


6、再简便

function getFn(fn){
   if(typeof fn !== 'function') return;
   return fn.name?
          fn.name:
         /function(.+)\(/.exec(fn+'')[1];//三部运算符技巧,注意换行
}

function Person(){}
var p=new Person();
var name=getFn(p.constructor);
alert(name);

采用逻辑中断:  ||   &&

return fn.name || /function(.+)\(/.exec(fn+'')[1];

合并
 
return typeof fn != 'function'? undefined:
                                 fn.name ||
                                /function(.+)\(/.exec(fn+'')[1];








0 0
原创粉丝点击