昨天面试出了一道面试题 本人我做错了 于是痛定思痛 再过一遍面向对象

var name="一体机";
var value="infolist"; //构造函数
function Anbay(){
this.name="安备";
this.value="anbay";
} //原型
Anbay.prototype.show=function(message){
alert(this.name);
alert(message);
} //对象
var dbbackup={
name:"迪备",
value:"dbbackup"
} //实例
var anbay=new Anbay()
anbay.show(this.value)//"安备" ,"infolist" 这里的this.value相当于window.value,构造函数被调用构造函数里面的this指向实例 anbay.show(dbbackup.value)//"安备","dbbackup" 这里的value是dbbackup里面的自然不用说,构造函数的作用域没有改变this.name弹出构造函数里面的dbbackup anbay.show.call(dbbackup,this.value)//"迪备","infolist" 这里的构造函数在对象dbbackup中执行,对象dbbackup拥有了所有的属性和方法

  

以下为个人测试得到的一些结果和数据

对理解面向对象很有用

1、属性类型 分为数据属性、访问属性

a.定义一个数据属性

/*var person={
} //属性所在的对象,属性的名字,和一个描述符对象
Object.defineProperty(person,"name",{
writable:false,
value:"Ewarm"
})
alert(person.name)
delete person.name
alert(person.name) var person={
} //属性所在的对象,属性的名字,和一个描述符对象
Object.defineProperty(person,"name",{
enumerable:true,
value:"Ewarm"
})

 

var person={}
Object.defineProperty(person,"name",{
configurable:false,
value:"Ewarm"
})
delete person.name
alert(person.name)//弹出Ewarm
Object.defineProperty(person,"name",{
configurable:true,
value:"Ewarm"
})//抛出错误 不能被定义
Object.defineProperty(person,"name",{
writable:true,
value:"cch"
})
person.name="cch"
alert(person.name)

b.定义一个访问属性
//访问器属性常用设置方式,即设置一个属性值会导致其他属性发生变化

var book={
_year:'2017',
edition:1
};
Object.defineProperty(book,"year",{
get:function(){//get 读取
return this._year;
},
set:function(newValue){ //set 写入
if(newValue>2017){
this._year=newValue;
this.edition+=newValue-2017
}
}
})
book.year=2018;
alert(book.edition)
alert(book._year)

//c.定义访问器的旧方法

var book={
_year:'2017',
edition:1
} book.__defineGetter__("year",function(){
return this._year
})
book.__defineSetter__("year",function(newValue){
if(newValue>2017){
this._year=newValue;
this.edition+=newValue-2017
}
})
book.year=2018
alert(book.edition)//

//d.定义多个属性

var book={}
Object.defineProperties(book,{
_year:{
writable:true,
value:2017
},
edition:{
writable:true,
value:1
},
year:{
get:function(){
return this._year;
},
set:function(newValue){
if(newValue>2017){
this._year=newValue;
this.edition+=newValue-2017
}
}
}
})
var descriptor=Object.getOwnPropertyDescriptor(book,"_year");//数据属性
alert(descriptor.value)
alert(descriptor.configurable)//用Object.defineProperties 这种configure默认为 false
alert(descriptor.enumerable)
alert(typeof descriptor.get);
var descriptor=Object.getOwnPropertyDescriptor(book,"year");
alert(descriptor.value);
alert(descriptor.enumerable);
alert(typeof descriptor.get);

2.创建对象

//a.工厂模式

function createPerson(name,age,job){
var o=new Object();
o.name=name;
o.age=age;
o.job=job;
o.sayName=function(){
alert(this.name)
}
return
}
var person1=createPerson("Ewarm",18,"software Engineer")
var person2=createPerson("CCH",18,"doctor")

//b.构造函数

function Person(name,age,job){
this.name=name;
this.age=age;
this.sayName=function(){
alert(this.name)
}
} var person1=new Person()
var person2=new Person()
var person=new Person("Ewarm",18,"software Engineer")

//1.当构造函数调用

person.sayName()
Person("Greg",27,"Doctor");

//2.当普通函数调用

window.sayName()

//3.在另一个对象的作用域中调用

var o =new Object()
var o={
character:"smart",
name:"Ew",
age:25,
job:"Nurse"
}
console.log(o)
Person.call(o,"cch",18,"nurse")//就是说这个构造函数 在o里面执行并且o里面的该有还是有 调用之后 之前的会被覆盖 没有的会被加上在o里面
o.sayName()
console.log(o)

//4.原型模式

function Person(){
}
Person.prototype.name="Ewarm";
Person.prototype.age="29";
Person.prototype.job="software Engineer";
Person.prototype.sayName=function(){
alert(this.name);
}
var person1=new Person()
//我们可以通过isPrototypeOf()方法来确定对象之间是否存在这种关系,即实例.__proto__是否指向构造函数的原型对象,如果指向那么这个方法返回为ture。
alert(Person.prototype.isPrototypeOf(person1))//true
//ECMAScript5增加了一个新方法 Object.getPrototype() 这个方法返回的是实例.__proto__的值,即构造函数原型对象 alert(Object.getPrototype(person1)==Person.prototype)//emmmm 我用的谷歌 报错了 说是支持可以实现了但没实现

注意:当我们要读取某个对象的某个属性时,都会执行一次搜索,目标是具有给定名字的属性。搜索首先从对象实例开始 问:你有没有我要的东西。如果有返回该属性的值。

如果没有继续往下面查找继续搜索指针指向的原型对象,在原型对那个中查找具有指定名字的属性,如果有返回该属性,如此一直到顶层Object。prototype,还没有返回undefine

原型有好多小细节 使用原型继承存在问题 但有解决的方法 这里我们先只说创建对象这一块

//5.组合使用构造函数和原型模式

//6.动态原型模式

//7.寄生构造函数模式

//8.稳妥构造函数模式

js面向对象知识点之对象属性 创建对象 总结中的更多相关文章

  1. 页面循环绑定(变量污染问题),js面向对象编程(对象属性增删改查),js字符串操作,js数组操作

    页面循环绑定(变量污染问题) var lis = document.querySelectorAll(".ul li") for ( var i = 0 ; i < lis. ...

  2. JS面向对象编程,对象,属性,方法。

    document.write('<script type="text/javascript" src="http://api.map.baidu.com/api?v ...

  3. JS面向对象系列教程 — 对象的基本操作

    面向对象概述  面向对象(Object Oriented)简称OO,它是一种编程思维,用于指导我们如何应对各种复杂的开发场景. 这里说的对象(Object),意思就是事物,在面向对象的思维中,它将一 ...

  4. JS面向对象编程:对象

    一般面向过程的写法都是写很多function,坏处:1.代码复用不好 2.函数名称容易重复冲突 下面介绍面向对象的写法: 在JS中每个函数function都是一个对象. 比如,下面这个就是一个对象,我 ...

  5. JS的从理解对象到创建对象

    JavaScript不是一门真正的面向对象语言,因为它连最基本的类的概念都没有,因此它的对象和基于类的语言中的对象也会有所不同.ECMA-262把对象定义为:“无序属性的集合,其属性可以包含基本值.对 ...

  6. js之oop <二> 对象属性

    js中对象属性可以动态添加和删除.删除对象属性用delete关键字. function obj(){ } var oo = new obj(); oo.a = "a"; oo.b ...

  7. JavaScript之面向对象的概念,对象属性和对象属性的特性简介

    一.大家都知道,面向对象语言有一个标志,那就是他们都有类的概念,通过类我们可以创建任意多个具有相同属性和方法的对象.但ECMAScript(指定JavaScript标准的机构,也就是说JavaScri ...

  8. 原来JS是这样的 - 对象属性

    引子 在上一篇(原来JS是这样的 (2))刚发布的时候就阅读了那篇文章的人可能会注意到那篇曾用过"JavaScript 中万物皆对象"的说法,而在随后我发现错误后立即更新改掉了这个 ...

  9. JS delete 用法(删除对象属性及变量)

    1,对象属性删除 function fun(){ this.name = 'mm'; } var obj = new fun(); console.log(obj.name);//mm delete ...

随机推荐

  1. 201521123110 《Java程序设计》第9周学习总结

    1. 本周学习总结 2. 书面作业 1.常用异常 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现什么异常.需要捕获吗(为什么)?应如何避免? 原来编写代码经常会出现数组访问 ...

  2. 201521123031 《Java程序设计》 第十周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 本次PTA作业题集异常.多线程 1.finally 题目4-2 1.1 截图你的提交结果(出 ...

  3. bind9的一些配置

    /etc/bind/named.conf.options:options { listen-on port 53 { any; }; // 监听在主机的53端口上.any代表监听所有的主机 direc ...

  4. RocketMQ之双Master方式部署以及简单使用

    1.1.服务器环境 192.168.100.24 root nameServer1,brokerServer1 Master1 192.168.100.25 root nameServer2,brok ...

  5. JPEG流封装AVI视频

    前言:前几天工作任务,要把JPEG流封装为AVI视频,就找了些AVI文件结构资料和示例代码研究了下,现将学习总结及最终完成的可用代码分享出来,由于本人也是现学现用,如有不恰当或错误之处,欢迎提出! 1 ...

  6. zoj 1874 水题,输出格式大坑

    Primary Arithmetic Time Limit: 2 Seconds      Memory Limit: 65536 KB Children are taught to add mult ...

  7. tomcat 内存大小配置

    Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个java虚拟机.JAVA程序启动时JVM都会分配一个初始内存和最大内存给这个应用程序.这个初始内存和最大内存在一定程度都会 ...

  8. 百度SMS SDK for .Net

    SMS 服务用于向指定的手机号码发送短信. 百度SMS提供了C, JAVA, Python的官方SDK,本项目依据API封装了面向.net的库,目前已经实现了基本的短信发送功能. 项目Github开源 ...

  9. 从实践的角度理解cookie的几个属性

    cookie的处理流程大致分为以下几步: 1.浏览器初次请求服务器. 2.服务器认为有必要设置cookie,通过响应报文首部:Set-Cookie告知浏览器,cookie的内容. 3.浏览器本地保存( ...

  10. 【转载】小tips: PC端传统网页试试使用Zepto.js进行开发

    Zepto.js设计之初专为移动端,不对一些古董浏览器支持.所以,尺寸很小,压缩后20K多一点,但是,jQuery压缩后,3.*版本要80多K,1.*版本则要90多K,4倍差距. 由于每个页面都会使用 ...