对象的原型链
来源:互联网 发布:赤壁赋一词多义知乎 编辑:程序博客网 时间: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];
- 对象的原型链
- JavaScript原型、原型链、对象的创建
- 对象,原型,原型链
- 对象&原型对象&原型链
- 对象的默认原型链
- JavaScript原型对象、原型属性、原型链
- 原型对象与原型链
- 原型对象和原型链
- 原型对象与原型链
- 原型对象与原型链
- 原型对象和原型链
- JS原型对象,原型链
- 原型对象与原型链
- 谈谈JS的核心技术:原型对象和原型链
- 三张图搞懂JavaScript的原型对象与原型链
- 谈谈JS的核心技术:原型对象和原型链
- 三张图搞懂JavaScript的原型对象与原型链
- 三张图搞懂JavaScript的原型对象和原型链
- apk重打包和签名(jarsigner)
- 欢迎使用CSDN-markdown编辑器
- Openstack MOS 8.0安装教程
- 1202 子序列个数
- vi命令
- 对象的原型链
- 关于Java中的final
- Android多线程编程之AsyncTask学习篇(二)
- RxJava操作符(03-变换操作)
- Binder学习笔记(十一)—— 智能指针
- 【Unity填坑日记】UGUI崩溃巨坑:UI::CanvasRenderer::SyncDirtyElements
- Swap Nodes in Pairs
- Centos 7 静态IP设置
- vmware 不能更改网络为桥接:已没有未桥接的主机网络适配器