第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对象:日期时间对象,可以获取系统的日期 ...
随机推荐
- 第八周课上额外项目:pwd的实现
项目要求: 1 学习pwd命令 2 研究pwd实现需要的系统调用(man -k; grep),写出伪代码 3 实现mypwd 4 测试mypwd 并且上交博客链接. 实验步骤 我首先不懂pwd到底是个 ...
- C语言复习20170826
数组 先定义,再初始化,最后使用. 访问数组中的元素可以采用数组名加下标的方式,下标是从0开始,c并不检查数组下标是否越界,所以在访问数组中的元素时需要注意,需要对数组下标做判断,防止访问数组越界. ...
- SRM 563 500pts SpellCards
SpellCards 题意: 有n张符卡排成一个队列,每张符卡有两个属性,等级li和伤害di. 两种操作: 1.把队首的符卡移动到队尾:2.使用队首的符卡,对敌人造成di点伤害,并丢弃队首的li张符卡 ...
- idea css文件不识别的问题的解决方案
可以看到 progressBar不识别 发现仅仅是这一个文件名不识别 所以换一个任意别的文件名即可识别
- CentOS7安装及配置vsftpd (FTP服务器)
CentOS7安装及配置vsftpd (FTP服务器) 1.安装vsftpd 1 yum -y install vsftpd 2.设置开机启动 1 systemctl enable vsftpd 3. ...
- cocos2dx2.0 帧动画的创建和播放过程 深入分析
一.帧动画的创建过程帧动画的实现有四个不可或缺的类,如下:1.CCSpriteFrame:精灵帧信息.存储帧动画的每一帧的纹理基本信息. class CC_DLL CCSpriteFrame : pu ...
- Vue.js之常用指令
vue常用指令 vue.js官方给自己的定义是数据模板引擎,并给出了一套渲染数据的指令.本文详细介绍vue.js的常用指令. 官网:点我 一.v-text.v-html v-text:用于绑定文本 v ...
- Java+Selenium 3.x 实现Web自动化 - Maven打包TestNG,利用jenkins执行测试
1. Jenkins本地执行测试 or 服务器端执行测试 测试代码计划通过jenkins执行时,通过网上查询各种教程,大多数为本地执行测试,由此可见,本地执行是大多数人的选择. 经过探讨,最终决定采用 ...
- Linux 安装Redis<集群版>(使用Mac远程访问)
阅读本文需要先阅读安装Redis<准备> 一 架构细节 所有的redis节点彼此互联(PING-PONG机制) 内部使用二进制协议优化传输速度和带宽 节点的fail是通过集群中超过半数的节 ...
- 《Cocos2d-x游戏开发实战精解》学习笔记3--在Cocos2d-x中播放声音
<Cocos2d-x游戏开发实战精解>学习笔记1--在Cocos2d中显示图像 <Cocos2d-x游戏开发实战精解>学习笔记2--在Cocos2d-x中显示一行文字 之前的内 ...