第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对象:日期时间对象,可以获取系统的日期 ...
随机推荐
- 20155224 实验一《Java开发环境的熟悉》实验报告
实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试Java程序. 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版) ...
- 20155230 实验二《Java面向对象程序设计》实验报告
20155230 实验二<Java面向对象程序设计>实验报告 一.单元测试 三种代码 知道了伪代码.产品代码.测试代码的关系和用途,并根据老师的例子,按测试代码调试了产品代码. 值得注意的 ...
- 20155331 2016-2017-2 《Java程序设计》
20155331 2016-2017-2 <Java程序设计> 教材学习内容总结 理解封装,继承和多态. 封装最简单的理解就是包装,把编译的class文件封装起来,便于管理,还可以设置密码 ...
- 【LG4841】城市规划
[LG4841]城市规划 题面 洛谷 题解 记\(t_i\)表示\(i\)个点的无向图个数,显然\(t_i=2^{C_i^2}\). 设\(f_i\)表示\(i\)个点的无向连通图个数,容斥一下,枚举 ...
- Android:制作聊天气泡点9图
步骤一:选择res下的一张图片,右击选择“Create 9-Patch File” 步骤二:确定点9图的名字,只能修改.9.png之前的信息 步骤三:在同目录下会生成刚才创建的点9图,双击打开进行编辑 ...
- (二)SpringBoot2.0基础篇- 静态资源的访问及Thymeleaf模板引擎的使用
一.描述 在应用系统开发的过程中,不可避免的需要使用静态资源(浏览器看的懂,他可以有变量,例:HTML页面,css样式文件,文本,属性文件,图片等): 并且SpringBoot内置了Thymeleaf ...
- Django模型层:单表操作
一 ORM简介 查询数据层次图解:如果操作mysql,ORM是在pymysq之上又进行了一层封装
- jenkins自动打包部署linux
需要用到2个插件. git parameter:用于参数化构建时选择分支. Publish Over SSH:用于上传jar包和操作tomcat 1.先在系统设置添加要连接的linux服务器,使用用户 ...
- sqlite两表更新update
1 2 3 4 5 6 7 8 9 10 11 12 UPDATE t1 SET Column1 = ( SELECT Columnx FROM t2 WHERE t2. KEY = ...
- 牛客网暑期ACM多校训练营(第一场):E-Removal(DP)
链接:E-Removal 题意:给出序列 s1, s2, ..., sn ,1<=s[i]<=10.问删除m个数后,有多少种不同的序列. 题解:定义dp[i][j]代表长度为i,最末尾的数 ...