第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对象:日期时间对象,可以获取系统的日期 ...
随机推荐
- 20155202 《Java程序设计》实验三(敏捷开发与XP实践)实验报告
20155202 <Java程序设计>实验三(敏捷开发与XP实践)实验报告 代码托管 实验内容 XP基础 XP核心实践 相关工具 实验要求 1.没有Linux基础的同学建议先学习<L ...
- 20155202 《Java程序设计》实验二(面向对象程序设计)实验报告
20155202 <Java程序设计>实验二(面向对象程序设计)实验报告 代码托管 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉 ...
- 在SQL SERVER中批量替换字符串的方法
UPDATE MainData SET Content = )) , 'XM00000137' , 'XM00000078') WHERE [Key] IN (SELECT md_key FROM i ...
- BZOJ1597_土地购买_KEY
题目传送门 一道斜率优化的题目. 但暴力方程很关键. 我们先将x作为关键字Sort一遍,再将y处理成单调递减,即把无用的土地去除. f[i]=f[j]+a[i]*b[j+] -a[i]*b[j+]+f ...
- 【BZOJ2589】[SPOJ10707]Count on a tree II
[BZOJ2589][SPOJ10707]Count on a tree II 题面 bzoj 题解 这题如果不强制在线就是一个很\(sb\)的莫队了,但是它强制在线啊\(qaq\) 所以我们就用到了 ...
- 【MYSQL用户创建报错】ERROR 1396 (HY000): Operation CREATE USER failed for 'user1'@'%'
原文参考自:http://blog.csdn.net/u011575570/article/details/51438841 1.创建用户的时候报错ERROR 1396 (HY000): Operat ...
- java获取IP地址
最近在一个多系统集成的项目中,由于跳转路径含IP地址,每次IP改了重启项目都得改好多地方,甚是麻烦.刚在网上了解到java获取IP地址,给大家分享下: 首先要导入jar包 request.getRem ...
- 前端之JavaScript(二)
一.概述 本篇主要介绍JavaScript的BOM和DOM操作,在前端之JavaScript(一)中介绍了JavaScript基础知识 1.1.BOM和DOM BOM(Browser Object M ...
- join 中的on和where的区别
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表, 然后再将这张临时表返回给用户. 在使用left jion时,on和where条件的区别如下: 1.on条件是在生成临时表时使用的条 ...
- leetcode个人题解——#39 Combination Sum
思路:先对数据进行排序(看评论给的测试数据好像都是有序数组了,但题目里没有给出这个条件),然后回溯加剪枝即可. class Solution { public: ; vector<vector& ...