第198天:js---内置对象的原型链和其他知识
一、内置对象的原型链
1、Object原型
function test() {}
alert(test.toString()); //新增属性
Object.prototype.mytest = function() {
alert("123");
}
var o = new Object();
o.mytest(); //重写属性
Object.prototype.toString = function()
{
alert("破坏之王");
}
o.toString();
2、Object对象是Function对象的实例
/*object的__proto__指向Function对象的原型*/
//Object对象是Function对象的一个实例
console.log(Object.__proto__ === Function.prototype);//true /*Function.prototype对象的原型的__proto__属性指向Object.prototype*/
console.log(Function.prototype.__proto__ === Object.prototype) /*object的原型的__proto__属性为null*/
console.log(Object.prototype.__proto__ ) /*总结*/
/*一个自定义对象可以访问到Function对象的所有属性和方法,也可以访问到Object对象的所有属性和方法*/
3、内置对象的实例指向
//Object对象是Function对象的一个实例
//Object对象的__proto__指向Function的原型
console.log(Object.__proto__===Function.prototype);//true console.log(Object.prototype.__proto__);//null console.log(Function.prototype.__proto__===Object);//false
console.log(Function.prototype.__proto__===Object.prototype);//true //内置对象的_proto_的指向
console.log(Number.__proto__ ===Function.prototype);//true
console.log(Boolean.__proto__ ===Function.prototype);//true
console.log(String.__proto__ ===Function.prototype);//true
console.log(Object.__proto__ ===Function.prototype);//true
console.log(Function.__proto__ ===Function.prototype);//true
console.log(RegExp.__proto__ ===Function.prototype);//true
console.log(Error.__proto__ ===Function.prototype);//true
console.log(Date.__proto__ ===Function.prototype);//true //自定义对象的原型的__proto__指向
function Product(){}; Product.prototype={}; var iphone=new Product();
console.log(Product.prototype.__proto__);//object
console.log(Product.prototype.__proto__===Object.prototype);//true //构造函数就是一个函数,函数都是由Function实现的,都是它的一个实例
console.log(Product.__proto__===Function.prototype);//true var obj = new Object();
//toString是object的方法,因为在原型中,所以所有对象都可以访问
//Object.prototype.toString=function(){};
console.log(obj.toString());//[object Object] /*object的实例指向Object的原型对象*/
console.log(obj.__proto__ === Object.prototype);//true
4、自定义对象的原型链
//object的__proto__指向的是Function.prototype
console.log(Object.__proto__ ===Function.prototype) /*null*/
console.log(Object.prototype.__proto__); /*object*/
console.log(Function.prototype.__proto__ === Object) //false
console.log(Function.prototype.__proto__ === Object.prototype) //ture /*内置对象的__proto__指向*/
console.log(Number.__proto__ === Function.prototype) // true
/*
Boolean.__proto__ === Function.prototype // true
String.__proto__ === Function.prototype // true
Object.__proto__ === Function.prototype // true
Function.__proto__ === Function.prototype //true
Array.__proto__ === Function.prototype // true
RegExp.__proto__ === Function.prototype // true
Error.__proto__ === Function.prototype // true
Date.__proto__ === Function.prototype // true*/ /*自定义对象的原型的__proto__指向*/
function Product(){} Product.prototype={} var iphone = new Product() console.log(Product.prototype.__proto__)
console.log(Product.prototype.__proto__ === Object) //false
console.log(Product.prototype.__proto__ === Object.prototype) //true var obj = new Object() /* Object.prototype.toString=function(){
alert('破坏之王')
}*/ console.log(obj.toString())
/*构造函数其实就是一个函数
函数都是Function实现的。都是它的一个实例*/ /* Function
Function.prototype
Object
Object.prototype*/ console.log(Product.__proto__ ===Function.prototype); console.log(Array.prototype.__proto__ === Object.prototype );
二、其他知识
1、hasOwnproperty
var person= function(){
age=1
}; person.prototype={
name:'wangshukui'
}; var xiaowang = new person();
//实例化之后 重新分配内存 系统会自动屏蔽原型同名 -- 原理 开辟新的空间 //
alert(xiaowang.hasOwnProperty("name"));//false --表明是原型属性 alert(xiaowang.hasOwnProperty("age")); //false --类属性 //当定义一个实例化属性之后,会自动屏蔽原型属性
xiaowang.name='小李';
alert(xiaowang.hasOwnProperty('name')) //true xiaowang.sex='nan';
alert(xiaowang.hasOwnProperty('sex')) //true
2、isPrototypeOf
判断iphone是否拥有Product的原型属性
function Product(){
this.name='iphone8';
this.description='手机中的战斗机';
this.price=7777;
this.date=new Date();
this.add = function(){};
} Product.prototype={
test:11111,
buy:function(){}
}
var iphone = new Product()
console.log(Product.prototype.isPrototypeOf(iphone));//true
3、constructor 查看对象的构造函数
//constructor : 查看对象的构造函数 /*function Aaa(){
} var a1 = new Aaa(); alert( a1.constructor ); //Aaa var arr = [];
alert( arr.constructor == Array ); //true*/ /*function Aaa(){
}
//Aaa.prototype.constructor = Aaa; //每一个函数都会有的,都是自动生成的 //Aaa.prototype.constructor = Array; var a1 = new Aaa();
alert( a1.hasOwnProperty == Object.prototype.hasOwnProperty ); //true*/ /*function Aaa(){
} Aaa.prototype.name = '小明';
Aaa.prototype.age = 20; Aaa.prototype = {
constructor : Aaa,
name : '小明',
age : 20
}; var a1 = new Aaa();
alert( a1.constructor );*/ function Aaa(){
} Aaa.prototype.name = 10;
Aaa.prototype.constructor = Aaa; for( var attr in Aaa.prototype ){
alert(attr);
}
4、instanceof : 对象与构造函数在原型链上是否有关系
//instanceof : 对象与构造函数在原型链上是否有关系 function Aaa(){
} var a1 = new Aaa(); //alert( a1 instanceof Object ); //true var arr = []; alert( arr instanceof Array );//true
5、静态属性、原型属性和实例属性
//对象构造函数
function Atest(name){
//私有属性,只能在对象构造函数内部使用
var className = "Atest";
//公有属性,在对象实例化后调用
this.name = name;
//对象方法
this.hello = function(){
alert(this.name);
alert(this.msg());//使用原型方法扩充的方法可以在类内部使用
alert(this.sex);//使用原型方法扩充的属性可以在类内部使用
alert(Atest.age);//静态属性调用时格式为[对象.静态属性]
}
}
//类方法 (实际是静态方法直接调用) 位置:Person类的外部 语法格式:类名称.方法名称 = function([参数...]){ 语句行; }
Atest.Run = function(){
alert("我是类方法 Run");
} //原型方法
Atest.prototype.msg = function(){
alert("我的名字是:"+this.name);//如果原型方法当作静态方法直接调用时,this.name无法被调用
} //公有静态属性 在类的外部
Atest.age = 20;//公有静态属性不能使用 【this.属性】,只能使用 【对象.属性】 调用 //原型属性,当作是类内部的属性使用【this.原型属性】,也可以当成公有静态属性使用【对象.prototype.原型属性】
Atest.prototype.sex = "男"; Atest.Run(); //类方法也是静态方法,可以直接使用 【对象.静态方法()】
Atest.prototype.msg();//原型方法当成静态方法使用时【对象.prototype.方法()】
alert(Atest.prototype.sex);//原型属性当作静态属性使用时【对象.prototype.方法()】
var a = new Atest("zhangsan");//对象方法和原型方法需要实例化对象后才可以使用
a.hello();//对象方法必须实例化对象
a.msg();//原型方法必须实例化对象
alert(a.age)://错误,公有静态属性只能使用 【对象.属性】调用 //ps:尽量将方法定义为原型方法,原型方法避免了每次调用构造函数时对属性或方法的构造,节省空间,创建对象快.
第198天:js---内置对象的原型链和其他知识的更多相关文章
- JS内置对象的原型不能重定义?只能动态添加属性或方法?
昨天马上就快下班了,坐在我对面的同事突然问我一个问题,我说“爱过”,哈哈,开个玩笑.情况是这样的,他发现JS的内置对象的原型好像不能通过字面量对象的形式进行覆盖, 只能动态的为内置对象的原型添加属性或 ...
- JS高级. 03 混入式继承/原型继承/经典继承、拓展内置对象、原型链、创建函数的方式、arguments、eval、静态成员、实例成员、instanceof/是否在同一个原型链
继承:当前对象没有的属性和方法,别人有,拿来给自己用,就是继承 1 混入式继承 var I={ }; var obj = { name: 'jack', age:18, sayGoodbye : fu ...
- 4月5日--课堂笔记--JS内置对象
JavaScript 4.5 一. JS内置对象 1.数组Array a)创建语法1:var arr=new Array(参数); i. 没有参数:创建一个初始容量为0的数组 ii. ...
- JS内置对象有哪些?
JS内置对象分为数据封装类对象和其他对象 数据封装类对象:String,Boolean,Number,Array,和Object; 其他对象:Function,Arguments,Math,Date, ...
- JS内置对象-String对象、Date日期对象、Array数组对象、Math对象
一.JavaScript中的所有事物都是对象:字符串.数组.数值.函数... 1.每个对象带有属性和方法 JavaScript允许自定义对象 2.自定义对象 a.定义并创建对象实例 b.使用函数来定义 ...
- 5月15日上课笔记-js中 location对象的属性、document对象、js内置对象、Date事件对象、
location的属性: host: 返回当前主机名和端口号 定时函数: setTimeout( ) setInterval() 二.document对象 getElementById(); 根据ID ...
- js课程 3-9 js内置对象定时器和超时器怎么使用
js课程 3-9 js内置对象定时器和超时器怎么使用 一.总结 一句话总结:定时器: 1.定义 sobj=setInterval(func,1000); 2.清除 cl ...
- js课程 2-8 js内置对象有哪些
js课程 2-8 js内置对象有哪些 一.总结 一句话总结:JS中内置了17个对象,常用的是Array对象.Date对象.正则表达式对象.string对象.Global对象. 1.js常用对象有哪些? ...
- JS 内置对象 String对象
JS内置对象 String对象:字符串对象,提供了对字符串进行操作的属性和方法. Array对象:数组对象,提供了数组操作方面的属性和方法. Date对象:日期时间对象,可以获取系统的日期 ...
随机推荐
- [arc082E]ConvexScore-[凸包]
Description 传送门 Solution em又是神仙题. 考虑到目前的一个凸包,顶点点集为S. 现在在它内部或边缘上的点集为T,则贡献为2|T|−|S|,设从T中去掉S的点后得到了集合A.则 ...
- Maven学习(十六)-----Maven插件
Maven插件 Maven 是一个执行插件的框架,每一个任务实际上是由插件完成的.Maven 插件通常用于: 创建 jar 文件 创建 war 文件 编译代码文件 进行代码单元测试 创建项目文档 创建 ...
- Python range() 函数用法
函数语法 range(start, stop[, step]) 参数说明: start: 计数从 start 开始.默认是从 0 开始.例如range(5)等价于range(0, 5); stop: ...
- MySQL数据库--连接
MySQL数据库的概念: MySQL数据库,包括客户端和服务端.客户端就是操作数据库的终端(命令行.navicat),服务端就是安装有MySQL软件的主机(本机或者服务器),MySQL数据库的端口一般 ...
- Jenkins+git+Nginx
1.Jenkins 一.tomcat安装 1.下载JDK和Tomcat //通过wget下载 wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomca ...
- CsvHelper文档-6类型转换
CsvHelper文档-6类型转换 CsvHelper使用类型转换器来转换string到对象,或者对象到string: ITypeConverter 类型转换器的结构,必须实现: public int ...
- zabbix_agentd-install.sh (脚本部署zabbix_agentd服务)
原文发表于cu:2016-05-20 基于http://www.cnblogs.com/netonline/p/7406598.html(http://blog.chinaunix.net/uid-2 ...
- 基于C#的机器学习--面部和动态检测-图像过滤器
在本章中,我们将展示两个独立的例子,一个用于人脸检测,另一个用于动态检测,以及如何快速地将这些功能添加到应用程序中. 在这一章中,我们将讨论: 面部检测 动态检测 将检测添加到应用程序中 面部检测 人 ...
- PHP学习和使用总结
起因 学习和使用PHP也有不少年头了,而自己也在学习和使用其他许多语言.我想通过这个总结来给自己一个交代.另一方面也分享一下开发经验,如何用PHP开发和管理大型的项目. 闲聊 许多人说自己1天学会PH ...
- Xftp安装和使用的视频录制方法
内容: 1.使用工具 2.操作步骤及方法 视频地址: http://v.youku.com/v_show/id_XMzEwNjg2MTg2NA==.html?spm=a2h3j.8428770.341 ...